好的,所以我有一个问题。
我有一个活动,它控制一个 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 是一个 ListFragment,没有对应的布局 xml,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 上看到两个选项卡,我可以在两者之间切换而不会出现任何问题。第一个选项卡包含列表,第二个选项卡包含一些其他内容。
当我从列表中选择一个项目时,我想将一个名为 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:当我从分类切换到子分类后按回,子分类片段弹出,我回到分类列表。没关系。当我选择一个类别时,要创建一个子类别片段,切换到第二个选项卡,然后按回,列表就会消失。当我单击返回第一个选项卡时,类别片段不可见。
3:当我做上面提到的事情时,而不是在第二个选项卡中按回,我切换回第一个选项卡,然后按回,我受到了欢迎
06-15 20:11:12.151: E/AndroidRuntime(18971): java.lang.IllegalStateException: Fragment already added: CategoriesFragment{414d9350 #0 id=0x1020002 fanfictionnet_categories}
所以,正如你所看到的,有些东西不像我想要的那样工作。我究竟做错了什么?