在我们的应用程序中,我们有一个带有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()命令。
我构建了一个最小的应用程序来测试这些行为。我一步一步地做,找到我的错误。为了测试它,我为每个重要的方法添加了日志。我的结果如下。
>
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
行为完全没问题。碎片的生命周期与活动的生命是完全联系在一起的。onstart
、onpause
、onstop
所有方法都将基于活动生命周期类似的方法调用。在调用活动“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
我在中有片段。当我最小化应用程序时,它将对中的片段调用,然后当我恢复应用程序时,它将调用。但当我再次将其最小化时,不再被调用。 您对此有什么想法吗?