在我们的应用中,我们有一个带有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
将发生错误!
结果
日志告诉我,当转发器片段没有添加到后台堆栈时,就会发生错误。有人知道为什么生命周期中存在这种差异吗?
我想我要操纵测试片段中的后栈。我可以弹出它,以便转发器不再位于后端堆栈的顶部。我试试看。
答案 0 :(得分:1)
行为完全正常。片段的生命周期与活动的生命完全相关。
onStart
,onPause
,onStop
将根据活动生命周期类似的方法调用所有方法。在调用片段'onPause'方法之前,您不会收到活动'onPause'的任何回调。请阅读android片段文档。
Fragment不是活动,它就像任何其他视图或小部件一样,但它有一些来自activity的回调方法,这使得它与视图不同。
阅读此check this