当前位置: 首页 > 知识库问答 >
问题:

片段的BackButton不调用onPause()或onStop()

董花蜂
2023-03-14

在我们的应用程序中,我们有一个带有FrameLayout的活动。这个布局显示了几个片段。要在片段之间进行更改,我们使用以下方法:

public static void replaceFragment(FragmentManager manager, Fragment fragment, boolean addToBackStack)
{
    FragmentTransaction transaction = manager.beginTransaction();

    Fragment currentFragment = manager.findFragmentById(R.id.container);
    if (currentFragment != null)
    {
        transaction.remove(currentFragment);

        if (addToBackStack)
        {
            transaction.addToBackStack(currentFragment.getClass().getName());
        }
    }

    transaction.add(R.id.container, fragment);
    transaction.commit();
}

如果用该方法更改片段,一切都将正常工作。不幸的是,问题是后退按钮似乎被打破了。如果我们在其中一个片段处按下它,FrameLayout将正确更新。但碎片不会被摧毁。Android不调用onPause()、onStop()和OnDestroyView()方法。因此,操作栏没有正确更新。它仍然显示该片段中的菜单项。令人不安的是,这种行为仅仅来自一个特殊的片段。其他碎片都很好。

在按下standby按钮后发生了一件有趣的事情,因为在此交互之后,将立即调用片段中所有丢失的onPause()和onStop()命令。

我构建了一个最小的应用程序来测试这些行为。我一步一步地做,找到我的错误。为了测试它,我为每个重要的方法添加了日志。我的结果如下。

Szenario 1:向后堆栈添加转发器片段

>

  • app启动(主页片段打开):

    07-03 09:20:42.939  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onAttach
    07-03 09:20:42.939  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onCreate
    07-03 09:20:42.939  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onCreateView
    07-03 09:20:43.039  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onStart
    07-03 09:20:43.069  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onResume
    
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onAttach
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onCreate
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onCreateView
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStart
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onResume
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onPause
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStop
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDestroyView
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onAttach
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onCreate
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onCreateView
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onStart
    07-03 09:21:42.572  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onResume
    
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onPause
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onStop
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onDestroyView
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onDestroy
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/TestFragent? onDetach
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onCreateView
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStart
    07-03 09:22:53.538  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onResume
    
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onPause
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStop
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDestroyView
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDestroy
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDetach
    07-03 09:23:18.755  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onCreateView
    07-03 09:23:18.795  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onStart
    07-03 09:23:18.795  16461-16461/de.hsanhalt.studiappkoethen D/HomeFragment? onResume
    
    07-03 09:29:52.495  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onPause
    07-03 09:29:52.505  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onStop
    

    Szenario 2:不要向后堆栈添加转发片段

    >

  • app启动(主页片段打开):

    07-03 09:28:00.435  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onAttach
    07-03 09:28:00.435  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onCreate
    07-03 09:28:00.435  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onCreateView
    07-03 09:28:00.536  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onStart
    07-03 09:28:00.566  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onResume
    

    打开转发器片段(将主片段添加到后堆栈)

    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onPause
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onStop
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onDestroyView
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onAttach
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onCreate
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onCreateView
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStart
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onResume
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onPause
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onStop
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDestroyView
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onAttach
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onCreate
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onCreateView
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onStart
    07-03 09:28:59.058  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onResume
    
    07-03 09:29:28.990  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDestroy
    07-03 09:29:28.990  18158-18158/de.hsanhalt.studiappkoethen D/ForwarderTestFragment? onDetach
    07-03 09:29:28.990  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onCreateView
    07-03 09:29:29.030  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onStart
    07-03 09:29:29.030  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onResume
    
    07-03 09:29:52.495  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onPause
    07-03 09:29:52.495  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onPause
    07-03 09:29:52.505  18158-18158/de.hsanhalt.studiappkoethen D/HomeFragment? onStop
    07-03 09:29:52.505  18158-18158/de.hsanhalt.studiappkoethen D/TestFragent? onStop
    
  • 共有1个答案

    孟佑运
    2023-03-14

    行为完全没问题。碎片的生命周期与活动的生命是完全联系在一起的。onstartonpauseonstop所有方法都将基于活动生命周期类似的方法调用。在调用活动“on pause”方法之前,不会对片段“on pause”进行任何回调。请阅读android fragments文档。

    Fragment不是activity,它就像任何其他视图或小部件一样,但它有一些来自activity的回调方法,这使得它不同于view。

    碎片生命周期

     类似资料:
    • 我在一个activity里有多个碎片。在一个按钮点击我开始一个新的片断,将它添加到backstack。我自然希望调用当前片段的方法和新片段的。但这并没有发生。 我所期待的是, 单击按钮时,LoginFragment将被替换为HomeFragment、LoginFragment的以及HomeFragment的将被调用 按下“上一步”时,将弹出HomeFragment并看到LoginFragment,

    • 我有一个有3个选项卡的ViewPager。根据我所看到的情况,当容器活动开始时,前两个片段将处于恢复状态。我还注意到,只有并排的两个片段被恢复,第三个被停止。我遇到的问题是,我从网络加载数据用于第一个片段,并将自定义对象存储在一个ArrayList中,这很正常,但当我导航到第三个片段时,数据会随着第一个片段进入停止状态而丢失。因此,当从第三个片段导航回第一个片段时,ArrayList就会为空(我在

    • 在使用带有片段的时,在选项卡之间移动时不会调用我们的和方法。我们有什么办法可以从碎片中找出我们是被发现还是被隐藏? 不幸的是,我在、中有逻辑,就像在location services注册一样,在切换选项卡时永远不会停止,因为在退出整个应用程序之前,永远不会调用。

    • 嗨,我在主片段内使用带有碎片网的viewPager。我试图从画廊或相机中获取图像到位图,但在选择照片并启动ActivityForResult后,它不会在onActivityResult中捕获... 以下是我如何调用startActivityForResult: 这是我的onActivityResult: 有什么想法吗?

    • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit

    • 我在中有片段。当我最小化应用程序时,它将对中的片段调用,然后当我恢复应用程序时,它将调用。但当我再次将其最小化时,不再被调用。 您对此有什么想法吗?