android - fragment/Activity 生命周期和方向变化

标签 android android-fragments orientation-changes

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/

相关文章:

java - 如何使用自定义操作栏?

android - 在 LinearLayout 中的现有 fragment 下方动态添加 fragment

android - 如何将垂直准则转换为百分比

android - 方向更改时的 LoaderManager 行为

android - Webview 重新加载蜂窝中的方向变化

android - Flutter:无法发出 HTTP-GET 请求

android - Jetpack 撰写 : How to create a rating bar?

android - 显示软键盘时向上移动布局?

android - 膨胀类 fragment Android Map v2 时出错

javascript - 防止 Android WebView 中锁定方向的 JS 方向更改事件