在我的应用程序中,我有3个片段。
App以[1]开头,用户只能导航到[2],然后可选择导航到[3]。
由于[3]内心深处,我希望[3]直接回到[1]。
目前我使用addToBackStack(null)调用[2]。由于我没有在[3]上调用addToBackStack,我认为它会回到[1]。
会发生什么,[3]返回[1],但现在两个片段都重叠显示。 Fragment [3]不会调用onPause()。再次调用片段[2]将在其他片段之上显示[2],而不是清除屏幕。
来回导航会使应用程序崩溃。有时在打开新片段时,有时候在按下后退按钮时。始终使用“已添加片段”错误(后退按钮非常奇怪,但我在切换片段之前也会检查它。)
任何可能导致这种奇怪行为的想法?使用addToBackStack或[3]也可以解决问题,但不能解决我的要求。我会在适当的时候调用所有超级方法。
信息:http://beadsoft.de/android/FragmentTest.zip下载的代码示例
2.x,4.2.2上的相同行为。使用ActionBarCompat。
添加片段的代码:
FragmentManager fm = getActivity().getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag(Fragment_xyz.FRAG_TAG);
if (fragment == null)
fragment = Fragment_xyz.newInstance(int data);
fm.beginTransaction().replace(R.id.container, fragment, Fragment_xyz.FRAG_TAG)
.addToBackStack(null).commit()
答案 0 :(得分:0)
片段的工作方式存在问题。请参阅上述应用程序的以下生命周期:
LifeCycle of the App
start
04-07 20:34:46.115: D/Fragment_1(15309): onCreateView Fragment_1
04-07 20:34:46.115: D/Fragment_1(15309): onResume Fragment_1
Click to open 2
04-07 20:34:49.148: D/Fragment_1(15309): onPause Fragment_1
04-07 20:34:49.148: D/Fragment_2(15309): onCreateView Fragment_2
04-07 20:34:49.148: D/Fragment_2(15309): onResume Fragment_2
Click to open 3
04-07 20:34:53.633: D/Fragment_2(15309): onPause Fragment_2
04-07 20:34:53.633: D/Fragment_3(15309): onCreateView Fragment_3
04-07 20:34:53.633: D/Fragment_3(15309): onResume Fragment_3
back Button. Since 3 is not on backstack, app returns to 1 (not pausing 3)
Here Frag 1 and 3 are running and displayed overlaying!
04-07 20:35:03.653: D/Fragment_1(15309): onCreateView Fragment_1
04-07 20:35:03.653: D/Fragment_1(15309): onResume Fragment_1
back Button on 1 - App exit
04-07 20:35:23.474: D/Fragment_1(15309): onPause Fragment_1
04-07 20:35:23.474: D/Fragment_3(15309): onPause Fragment_3
Google现已提出问题:https://code.google.com/p/android/issues/detail?id=68160
拥有此功能并来回导航将导致应用程序崩溃,因为FragmentManager基本上会暂停并恢复错误的碎片。
答案 1 :(得分:0)
为什么不将每个片段添加到backstack?而不是:
MyNewFragment f=new MyNewFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.container, f).commit();
尝试:
MyNewFragment f=new MyNewFragment();
getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.container, f).commit();