2012-02-15 23 views
2

私はタブを実装する機能を追加するためにタブを既存のアプリケーションに追加しようとしています。しかし、現時点で設定している方法では、タブごとのスタックは保持されません。だから基本的に私はメインのFrameActivityタブを処理し、各タブにフラグメントを添付します。私の研究の間にタブとフラグメント、別々のバックスタック

私はこのスレッドを見つけた:彼が与えるhttps://stackoverflow.com/a/7480080/792407

の例では、多くの意味になりますが、私はフラグメントが表示するように見えることはできません。だから、私が正しく理解していることを確認するために何をしているのかを説明しましょう:

私はFragmentActivityを拡張してタブを処理するメインタブアクティビティを持っています。私は私のタブを初期化し、この活動の中で

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <TabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      > 
      <TabWidget 
       android:id="@android:id/tabs" 
       android:orientation="horizontal" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="0" 
       /> 
      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="0dp" 
       android:layout_height="0dp" 
       android:layout_weight="0"/> 

      <FrameLayout 
       android:id="@+android:id/realtabcontent" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp" 
       android:layout_weight="1"/> 
     </LinearLayout> 
    </TabHost> 
</LinearLayout> 

:レイアウトは次のようになります

mTabHost = getTabHost();   
Resources res = getResources(); 
Intent intent;   
TabHost.TabSpec spec; 

//search tab 
intent = new Intent().setClass(this, searchFragmentStack.class); 
spec = mTabHost.newTabSpec("search").setIndicator("Search",res.getDrawable(R.drawable.ic_tab_search)).setContent(intent);   
mTabHost.addTab(spec); 

//home tab 
intent = new Intent().setClass(this, homeFragmentStack.class); 
spec = mTabHost.newTabSpec("home").setIndicator("Home",res.getDrawable(R.drawable.ic_tab_home)).setContent(intent);   
mTabHost.addTab(spec); 

のように私は見て使用していたスタッククラス:ActivityInTab抽象クラスが同じである

public class searchFragmentStack extends ActivityInTab { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      navigateTo(new search()); 
     } 
} 

彼がスレッドで使用したコード:

abstract class ActivityInTab extends FragmentActivity { // FragmentActivity is just Activity for the support library. 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tabs_layout); 
    } 

    /** 
    * Navigates to a new fragment, which is added in the fragment container 
    * view. 
    * 
    * @param newFragment 
    */ 
    protected void navigateTo(Fragment newFragment) { 
     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.add(R.id.content, newFragment); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 

    @Override 
    public void onBackPressed() { 
     FragmentManager manager = getSupportFragmentManager(); 
     if (manager.getBackStackEntryCount() > 0) { 
      // If there are back-stack entries, leave the FragmentActivity 
      // implementation take care of them. 
      super.onBackPressed(); 
     } else { 
      // Otherwise, ask user if he wants to leave :) 
      //showExitDialog(); 
     } 
    } 

} 

とスタックのレイアウトは、再び彼の例に基づいています。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/content" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:isScrollContainer="true"> 
</RelativeLayout> 

そして、それはかなりそれです。私が得るのは、タブに黒い画面が表示されるだけなので、レイアウトの問題だと思うのですが、間違っているだけです。これは理にかなっていますか?より良い方法がありますか?何か不足していますか?どんな助けでも大歓迎です。

私はダミーのプロジェクトを開始し、最初からすべてをやった後、それを考え出した

答えて

2

私は活動を使用して、通常のタブを作成していたかのように私は、タブを処理するために使用していた活動がTabActivityとimplimentedにする必要がありますただし、別のFragmentActivity「スタック」を使用して各タブのコンテンツを管理する点を除いては、また、私はタブの活動のために使用したレイアウトは、私が何をやっていたために間違っていた、私は今使用しています:これらの2つの主要な変更だった

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:padding="5dp"> 
     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:padding="5dp" /> 
    </LinearLayout> 
</TabHost> 

、私はケースのテストプロジェクトのソースをアップロードしました誰もが自分自身のプロジェクトのためにそれを参照するように望んでいる:

Seperate Fragment Stacks in Tabs

EDIT

はそのタバックを言及するのを忘れましたtivityは推奨されていないので、将来のアンドロイド版のためにこのメソッドに頼るべきではありません。私はFragmentActivityを使ってこれを実装する方法を理解していません。それは私の現在のニーズに対応し、新しい方法をどうやって実現するかを理解する時間を与えてくれます。

+0

あなたがローテーションで何かをやっているの?見ることする価値があるかもしれあなたがタブ1とフラグメントBにいるとき、あなたはフラグメントAに戻ります。 – Streetboy

+0

@ Streetboyアクティブなフラグメント名をonSaveInstanceStateに保存する必要があります。したがって、そのメソッドをオーバーライドし、アクティブなフラグメント名を保存し、次にアプリケーションが起動するときに、savedInstanceStateバンドル内の文字列を探します。見つかったら、そのフラグメント画面に切り替えます。 – Buffalo

+2

リンクからコードをダウンロードしましたが、tabActivityは廃止されました。api> 14!それにはどんな解決策もありますか? –

関連する問題