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
- 应用程序启动(主片段打开):
- 打开转发器片段(将主片段添加到后堆栈)
- 单击后退按钮(返回主页,因为转发器未添加到后堆栈)
- 点击电源按钮
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