Android Fragment Back Button覆盖其他片段并保持活动状态

时间:2014-04-04 14:22:11

标签: android android-fragments

在我的应用程序中,我有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()

2 个答案:

答案 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();