【问题标题】:Android Fragment Back Button overlays other fragment and keeps activeAndroid Fragment Back Button 覆盖其他 Fragment 并保持活动状态
【发布时间】:2023-04-04 15:31:01
【问题描述】:

在我的应用中,我有 3 个片段。

应用以 [1] 开头,用户只能导航到 [2],然后可以选择导航到 [3]。

由于[3]在深处,我希望[3]直接回到[1]。

目前我使用 addToBackStack(null) 调用 [2]。因为我没有在 [3] 上调用 addToBackStack,所以我认为它会回到 [1]。

发生的情况是,[3] 返回到 [1],但现在两个片段重叠显示。片段 [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()

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    片段的工作方式存在问题。查看上述应用的以下生命周期:

    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 基本上会暂停和恢复错误的片段。

    【讨论】:

      【解决方案2】:

      为什么不将每个片段都添加到后台堆栈?而不是:

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

      【讨论】:

      • 应用程序如何直接从片段 3 转到片段 1,当用户点击返回按钮时跳过片段 2?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多