问题在于正确管理后退栈,以便弹出(或删除)上一个片段。问题在于它们的重叠。
程序结构如下:
- 滑动菜单包含3个部分的片段:CatalogFragment、NewsFragment、BlogFragment; - 每个片段都是一个ListView,其中的项是从JSON解析而来的; - 在CatalogFragment的项目单击时,我需要用LessonsFragment替换这个CatalogFragment,它也是一个列表。
附注:项是俄语,但我认为你可以理解。
这是这些片段如何添加(动态)的方式:
程序结构如下:
- 滑动菜单包含3个部分的片段:CatalogFragment、NewsFragment、BlogFragment; - 每个片段都是一个ListView,其中的项是从JSON解析而来的; - 在CatalogFragment的项目单击时,我需要用LessonsFragment替换这个CatalogFragment,它也是一个列表。
附注:项是俄语,但我认为你可以理解。
这是这些片段如何添加(动态)的方式:
@Override
public void onNavigationDrawerItemSelected(int position) {
FragmentManager fragmentManager = getSupportFragmentManager();
// fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); //this also doesn't work
switch (position+1) {
case 1:
//getSupportFragmentManager().popBackStack(); // this doesnt work
fragmentManager.beginTransaction().replace(R.id.container,
CatalogFragment.newInstance(position + 1)).addToBackStack("catalog").commit();
break;
case 2:
fragmentManager.beginTransaction().replace(R.id.container,
NewsFragment.newInstance(position + 1)).addToBackStack("news").commit();
break;
case 3:
fragmentManager.beginTransaction().replace(R.id.container,
BlogFragment.newInstance(position + 1)).addToBackStack("blog").commit();
break;
}
}
以下是我在接口 onCatalogFragmentInteraction
方法中如何用新的片段替换当前片段的步骤:
/** Methods for interaction with list items*/
@Override
public void onCatalogFragmentInteraction(String id){
//pop previous
getSupportFragmentManager().popBackStack("catalog", FragmentManager.POP_BACK_STACK_INCLUSIVE);
//add new
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, LessonsFragment.newInstance());
fragmentTransaction.addToBackStack("lessons");
fragmentTransaction.commit();
}
...并且这个工作很好:
但是当我从滑动菜单的片段返回到片段时,它们会重叠。
我认为问题在于适当的BackStack管理,但我无法弄清楚自己做错了什么。另一个建议是,在这种情况下,我需要更好地使用add/replace
。
我已经尝试从堆栈中按名称删除。也许需要按ID删除它们?
P.S. 如果需要更多代码,请告诉我。 提前致谢。
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentInstance).addToBackStack( some_name ).commit();
来弹出后退栈并在其上创建一个新的片段。但是当我尝试仅通过名称弹出后退栈(而不创建新的片段)时,它似乎对我非常有效。顺便说一下,我只是从一个片段返回到调用它的片段。但我想分享我的过程。 - nviensandroid:clickable="true" android:focusable="true"
来解决这个问题。 - Mihae Kheel