在ActionBar中用另一个替换ListFragment - 新的listfragment替换其他片段,当按下时返回IllegalStateException

时间:2013-06-15 18:17:08

标签: android android-fragments android-actionbar android-listfragment fragmenttransaction

好的,我有问题。

我有一个控制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的简单片段。

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上看到两个标签,我可以在两者之间切换而没有任何问题。第一个选项卡包含列表,第二个选项卡包含其他一些内容。

当我从列表中选择一个项目时,我想将一个名为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();
}

问题是 - &gt;

1:当我在第一个标签中选择一个项目时,我的片段被子类别片段替换。但是,子类别片段的列表覆盖了第二个脱机选项卡的内容,即在内容上绘制的列表。

2:当我从类别切换到子类别后按回来时,子类别片段弹出,然后我返回到类别列表。没关系。 当我选择一个类别,进行子类别片段,切换到第二个选项卡,然后按回,列表消失。当我单击返回第一个选项卡时,类别片段不可见。

3:当我做上面提到的事情,而不是在第二个标签中按回来时,我切换回第一个标签,然后按回来,我受到了欢迎

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

所以,正如你所看到的,某些东西不能像我希望的那样工作。我做错了什么?

0 个答案:

没有答案