fragment 很有趣,但我认为,一旦您了解了它们的怪癖,它们就会成为跨多种设备编写优质代码的宝贵工具。
但是,在修复方向更改错误时,我遇到了麻烦。为了让我的 fragment 工作,它需要访问属于它的 View ,其中包含 Activity 引导我进行愉快的追逐,试图找到 Activity 和 Fragment 生命周期如何交互。
我在 Activities View 的 onCreate()
方法中添加了一个 fragment :
// Only add a fragment once, as after it's been added it cannot be replaced (Even though there is a .replace() method. Which is a massive gaping hole in fragments as a technology if you ask me)
if(savedInstanceState == null) {
MainMenuFragment menu= new MainMenuFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.menuFrame, menu);
transaction.commit();
}
导致此 Activity->Fragment 生命周期:
01-04 15:17:27.226: W/SinglePaneActivity 0: onCreate()
01-04 15:17:27.378: W/MainMenuFragment 0: onAttach() to SinglePaneActivity 0
01-04 15:17:27.378: W/MainMenuFragment 0: onCreate()
01-04 15:17:27.453: W/MainMenuFragment 0: onActivityCreated()
01-04 15:17:27.476: W/MainMenuFragment 0: onStart()
01-04 15:17:27.476: W/SinglePaneActivity 0: onStart()
01-04 15:17:27.476: W/SinglePaneActivity 0: onResume()
01-04 15:17:27.476: W/MainMenuFragment 0: onResume()
然而,方向更改强调通常情况并非如此, fragment onCreate()
方法不会在其父 Activity onCreate()
之后调用。事实上, fragment 的 onAttach()
的第一次生命周期调用发生在 Activity 甚至被创建之前(null
作为参数传递):
01-04 15:10:49.589: W/MainMenuFragment 0: onPause()
01-04 15:10:49.589: W/SinglePaneActivity 0: onPause()
01-04 15:10:49.589: W/MainMenuFragment 0: onStop()
01-04 15:10:49.589: W/SinglePaneActivity 0: onStop()
01-04 15:10:49.589: W/MainMenuFragment 0: onDestroyView()
01-04 15:10:49.589: W/MainMenuFragment 0: onDestroy()
01-04 15:10:49.589: W/MainMenuFragment 0: onDetach()
01-04 15:10:49.609: W/SinglePaneActivity 0: onDestroy()
01-04 15:10:49.617: W/MainMenuFragment 1: onAttach() to null
01-04 15:10:49.617: W/MainMenuFragment 1: onCreate()
01-04 15:10:49.617: W/SinglePaneActivity 1: onCreate()
01-04 15:10:49.890: W/MainMenuFragment 1: onActivityCreated()
01-04 15:10:49.917: W/MainMenuFragment 1: onStart()
01-04 15:10:49.917: W/SinglePaneActivity 1: onStart()
01-04 15:10:49.921: W/SinglePaneActivity 1: onResume()
01-04 15:10:49.921: W/MainMenuFragment 1: onResume()
我完全不知道为什么会这样。谁能阐明为什么在创建包含 Activity 之前调用 Fragment.onAttach()
?
我得到的 fragment 不需要访问它们包含的 Activity (直到 UI 交互)按预期工作。
最佳答案
哎呀,
01-04 15:46:23.175: W/MainMenuFragment 0: onAttach() to SinglePaneActivity 0
01-04 15:46:23.179: W/MainMenuFragment 0: onCreate()
01-04 15:46:23.246: W/MainMenuFragment 0: onActivityCreated() with Activity SinglePaneActivity 0
01-04 15:46:23.269: W/MainMenuFragment 0: onStart()
01-04 15:46:23.269: W/SinglePaneActivity 0: onStart()
我不知道为什么会有一个 onAttach()
方法。特别是因为“附加”发生在 Activity 之前。
我需要的方法当然是 onActivityCreated()
,它作为 Fragment lifecycle events 的“创建”集中的最后一次调用而发生。 .
关于android - fragment/Activity 生命周期和方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8729290/