片段的后退按钮不会调用onPause()或onStop()

时间:2014-07-01 18:16:08

标签: android android-fragments

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

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()方法。因此,操作栏未正确更新。它仍然显示该片段的菜单项。 令人不安的是,这种行为只来自一个特殊的片段。其他每个片段都可以。

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

编辑:

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

编辑2:

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

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

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

    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:不要将转发器片段添加到backstack

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

    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 个答案:

答案 0 :(得分:1)

行为完全正常。片段的生命周期与活动的生命完全相关。 onStartonPauseonStop将根据活动生命周期类似的方法调用所有方法。在调用片段'onPause'方法之前,您不会收到活动'onPause'的任何回调。请阅读android片段文档。

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

fragments life cycle

阅读此check this