Android 片段的BackButton不’;t调用onPause()或onStop()

Android 片段的BackButton不’;t调用onPause()或onStop(),android,android-fragments,Android,Android Fragments,在我们的应用程序中,我们有一个带有框架布局的活动。这个布局显示了几个片段。 要在片段之间进行更改,我们使用以下方法: public static void replaceFragment(FragmentManager manager, Fragment fragment, boolean addToBackStack) { FragmentTransaction transaction = manager.beginTransaction(); Fragment curren

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

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();
}
如果使用该方法更改片段,一切都会正常工作。不幸的是,问题在于“后退”按钮似乎已损坏。如果我们在其中一个片段上按下它,框架布局将正确更新。但是碎片不会被摧毁。Android不调用onPause()、onStop()和OnDestroyView()方法。因此,操作栏没有正确更新。它仍然显示该片段中的菜单项。 令人不安的是,这种行为仅仅来自一个特殊的片段。每一个碎片都很好

按下standby按钮后会发生一件有趣的事情,因为在这个交互之后,片段中所有错过的onPause()和onStop()命令都会立即被调用

编辑:

我将解释这个项目的结构。也许这会有帮助。 有一个android.support.v7.app.ActionBarActivity,它的抽屉布局包含FrameLayout和NavigationDrawerFragment。 FrameLayout用于显示与此应用程序相关的片段。单击导航抽屉项,FrameLayout中显示的片段将发生更改。单击back按钮,从后堆栈调用HomeFragment(起始片段)(仅此片段添加到后堆栈)。除了我们的测验外,它从每个片段都起作用。 测验包含几个州。导航抽屉项测验链接到一个选择器片段,该选择器片段读取测验的当前状态,并转发到应显示的测验片段(与状态相关)。就在我单击该片段的后退按钮时,HomeFragment显示正确,但该片段未被删除。它仍处于恢复状态。 有人知道如何解决这个问题吗

编辑2:

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

Szenario 1:将转发器片段添加到后堆栈中

  • 应用程序启动(主片段打开):

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

  • 单击后退按钮(返回到转发器,因为它已添加到后堆栈)

  • 单击后退按钮(返回主页)

  • 点击电源按钮

    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
    
    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
    
日志意味着,如果将转发器添加到后堆栈中,一切都将正常工作

Szenario 2:不要将转发器片段添加到backstack中

  • 应用程序启动(主片段打开):

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

  • 单击后退按钮(返回主页,因为转发器未添加到后堆栈)

  • 点击电源按钮

    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
    
    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
    
错误将会发生

结果

日志告诉我,当转发器片段没有添加到后堆栈时,错误就发生了。有人知道为什么生命周期会有这种差异吗


我想我必须操纵测试片段中的后堆栈。我可以把它打开,这样转发器就不在后栈的顶端了。我试试看

行为非常好。碎片的生命周期与活动的生命周期完全相关。
onStart
onPause
onStop
将根据活动生命周期类似方法调用所有方法。在调用活动“onPause”方法之前,不会收到对片段“onPause”的任何回调。请阅读android片段文档

片段不是活动,它和任何其他视图或小部件一样,但它有一些来自活动的回调方法,这使它不同于视图


读这篇

我读了。请看“创建片段”部分中的图片。如果单击“上一步”按钮输入最后一个片段,应用程序将调用当前片段的onPause、onStop和onDestroyView方法,并返回到旧片段的onCreateView方法。。此生命周期正常工作。但它在一个特殊的片段上不起作用。我不知道为什么(阅读此文,谢谢,但这对我没有帮助:(我编辑了我的描述。也许这会让我的问题更清楚一些。然后请检查片段中的实现差异。我的意思是,你是在添加、附加还是替换。如果没有任何东西起作用,那么请尝试从片段中的其他回调中实现。最后,如果没有任何东西对你起作用,请实现你的r own cal Baskcst这句话是错误的!“在调用活动“onPause”方法之前,您不会收到任何对片段“onPause”的回调。”。正确的是:“在调用片段“onPause”方法之前,您不会收到任何对活动“onPause”的回调。”
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
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