1

さて、問題があります。

ActionBar を制御するアクティビティがあります。それはonCreateで、次のようにアクションバーに入力します:

protected void onCreate(Bundle savedInstanceState) {
    //...some other things
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);
    siteSpecificFragmentManager.populateActionBar(this, actionBar);
}

最後の行は、表示したいタブ、非表示にしたいタブなどに応じて、アクション バーにタブを設定する方法を示しています。使用している例は次のようになります。CategoriesFragment は対応するレイアウト xml を持たない ListFragment であり、OfflineFragment はレイアウト xml を持つ単純な Fragment です。

public void populateActionBar(Activity activity, ActionBar bar) {

    Tab tab = bar.newTab().setText(R.string.tab_sites).setTabListener(
                    new TabListener<CategoriesFragment>(activity,"tag1",CategoriesFragment.class));
    bar.addTab(tab);

    tab = bar.newTab().setText(R.string.tab_offline).setTabListener(
                    new TabListener<OfflineFragment>(activity,"tag2", OfflineFragment.class));
    bar.addTab(tab);

}

TabListener は次のようになります。

public class MyFragmentListener<T extends Fragment> implements
    android.app.ActionBar.TabListener {

public MyFragmentListener(Activity activity, String tag, Class<T> tClass) {
    this(activity, tag, tClass, null);
}

public MyFragmentListener(Activity activity, String tag, Class<T> tClass,
        Bundle bundle) {

    this.activity = activity;
    this.tag = tag;
    this.tClass = tClass;
    this.bundle = bundle;

    fragment = activity.getFragmentManager().findFragmentByTag(tag);
    if(fragment != null && !fragment.isDetached()){
        FragmentTransaction fragmentTransaction = activity.getFragmentManager().beginTransaction();
        fragmentTransaction.detach(fragment);
        fragmentTransaction.commit();
    }
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if(fragment == null){
        fragment = Fragment.instantiate(activity, tClass.getName(),bundle);
        ft.add(android.R.id.content,fragment, tag);
    } else{
        ft.attach(fragment);
    }
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if(fragment != null){
        ft.detach(fragment);
    }
}
}

よし、すべて設定したので、動作するかどうか試してみましょう。アクティビティが開始されると、ActionBar に 2 つのタブが表示されます。問題なく両方を切り替えることができます。最初のタブにはリストが含まれ、2 番目のタブにはその他の項目が含まれます。

リストからアイテムを選択するときに、SubcategoryFragment と呼ばれる新しい ListFragment をプッシュしたいと考えています。これが私がやっている方法です:

public void onListItemClick(ListView l, View v, int position, long id) {
    Bundle bundle = new Bundle();
    bundle.putString("chosen", category[position]);

    Fragment fragment = new SubcategoryFragment();
    fragment.setArguments(bundle);

    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(getId(), fragment);
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.addToBackStack("category_to_subcategory");
    fragmentTransaction.commit();
}

そして問題は - >

1: 最初のタブで項目を選択すると、フラグメントがサブカテゴリ フラグメントに置き換えられます。ただし、サブカテゴリ フラグメントのリストは、2 番目のオフライン タブのコンテンツ (コンテンツの上に描画されたリスト) をオーバーレイします。

2: カテゴリからサブカテゴリに切り替えた後にもう一度押すと、サブカテゴリのフラグメントがポップして、カテゴリ リストに戻ります。大丈夫。カテゴリを選択して、サブカテゴリのフラグメントを作成し、2 番目のタブに切り替えて [戻る] を押すと、リストが消えます。クリックして最初のタブに戻ると、カテゴリ フラグメントが表示されません。

3: 上記の操作を行ったときに、2 番目のタブで戻るのではなく、最初のタブに戻ってから戻ると、

06-15 20:11:12.151: E/AndroidRuntime(18971): java.lang.IllegalStateException: Fragment already added: CategoriesFragment{414d9350 #0 id=0x1020002 fanfictionnet_categories}

ご覧のとおり、何かが思い通りに機能しません。私は何を間違っていますか?

4

0 に答える 0