片段/活动的生命周期和方向更改

11

片段是有趣的东西,但是我认为一旦你了解它们的怪癖,它们就成为了在多个设备上编写良好代码的宝贵工具。

然而,在修复方向更改错误时,我遇到了一个障碍。为了使我的片段正常工作,它需要访问属于其包含 Activity 的 View,这引导我花费很长时间寻找 Activity 和 Fragment 生命周期之间的交互方式。

我在 Activity 的 onCreate() 方法中添加一个片段到其视图中:

// 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()

然而,屏幕方向变化会突显出通常情况并不是这样的,一个片段的 onCreate() 方法在其父 Activity 的 onCreate() 方法之后并不会被调用。实际上,片段的第一个生命周期调用是发生在 Activity 被创建之前(以 null 作为参数传递)的 onAttach() 方法中:

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()吗?

对于那些在UI交互之前不需要访问其包含活动的片段,它们的工作正常。

1个回答

10

嗷,

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生命周期事件中"Creation"一组中的最后一个调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接