在我的开源Android应用程序中,发现了一个问题,即特定片段会出现在另一个片段之上,或者在特定情况下会使应用程序崩溃。
如果您想查看更多信息和示例屏幕截图,请查看GitHub上的问题:https : //github.com/rpi-mobile/RPIMobile-Android/issues/31
我已查明原因,但想知道使用android.support.v4.app包中的哪些方法来解决问题。
在中MainActivity.java,是用于FragmentTransaction.replace()切换片段的导航抽屉的代码。
之所以出现此问题,是因为在中MapFragment,我使用了:
ViewMapFragment vmf = new ViewMapFragment();
FragmentTransaction ft = getSherlockActivity().getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.content_frame, vmf);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
而在ViewMapFragment的onDestroyView():
FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fm.findFragmentById(R.id.mapview));
ft.commit();
Run Code Online (Sandbox Code Playgroud)
在onDestroyView()正确删除ViewMapFragment从视图,但如果你有它的视图,并使用导航抽屉变化到不同的片段,MapFragment还是回堆栈。
因此,对于我的问题:
1)在尝试删除/替换碎片之前,如何检查特定碎片是否在后堆栈上;如果您什么都不做,则应用程序不会崩溃(即不检查)吗?例如popBackStack(),在后栈上没有任何东西时调用。
2)应该使用FragmentManager类方法尝试MapFragment从后堆栈中删除还是应该使用FragmentTransaction方法?优点与缺点?
3)popBackStack()和之间的UI有什么区别popBackStackImmediate()?用户是否看到一些故障过渡?