Android 片段/活动生命周期和方向变化

Android 片段/活动生命周期和方向变化,android,android-fragments,orientation-changes,Android,Android Fragments,Orientation Changes,片段是很有趣的事情,但我认为,一旦你知道了它们的怪癖,它们就是跨多个设备编写好代码的无价工具 然而,在修复方向改变错误时,我碰到了一堵墙。为了让我的片段正常工作,它需要访问一个属于它的视图,它包含的活动将我带入一个愉快的追逐中,试图找到活动和片段生命周期是如何相互作用的 我正在其onCreate()方法中将一个片段添加到我的Activities视图中: // Only add a fragment once, as after it's been added it cannot be repla

片段是很有趣的事情,但我认为,一旦你知道了它们的怪癖,它们就是跨多个设备编写好代码的无价工具

然而,在修复方向改变错误时,我碰到了一堵墙。为了让我的片段正常工作,它需要访问一个属于它的视图,它包含的活动将我带入一个愉快的追逐中,试图找到活动和片段生命周期是如何相互作用的

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

// 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();
}
导致此活动->片段生命周期:

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()
但是,方向的更改强调了这通常不是这种情况,fragments
onCreate()
方法不会在其父活动
onCreate()
之后调用。实际上,片段的
onAttach()
的第一个生命周期调用发生在活动创建之前(
null
作为参数传递):

我完全不知道为什么会这样。有人能解释一下为什么在创建包含活动的
Fragment.onAttach()之前调用它吗

我得到的片段不需要访问它们的包含活动(直到UI交互)就能按预期工作。

Argh

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()
方法。特别是因为“附加”发生在活动之前

当然,我需要的方法是,
onActivityCreated()
,它作为“创建”集合中的最后一个调用发生

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