完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?

Posted

技术标签:

【中文标题】完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?【英文标题】:How is my fragment's onCreateView called before it's onCreate when finishing the activity in onCreate? 【发布时间】:2012-12-28 14:57:59 【问题描述】:

这很奇怪。我有一个简单的应用程序,一旦登录,它就会在活动中显示一个片段。该应用程序还有一个不活动“超时”,在此之后它完成活动并显示登录屏幕 - 如果应用程序在发生超时时处于后台,那么当活动中发生下一个 onCreateonStart 事件时完成了。

但是,有时当返回登录的活动时,我会在片段的 onActivityCreated 方法中得到 NPE。片段非常简单,只需调用字符串上的方法。字符串本身是通过调用 getArguments() 来检索的。我已经验证,每当创建 Fragment 时,始终会设置参数。

所以看起来onActivityCreated实际上是在片段中的onCreate之前调用的,我知道这应该是不可能的。以下是堆栈跟踪的一部分:

01-14 15:34:37.176: E/androidRuntime(3272):     at com.example.app.fragment.MyFragment.onActivityCreated(MyFragment.java:203)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentManagerImpl.dispatchReallyStop(FragmentManager.java:1888)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentActivity.onReallyStop(FragmentActivity.java:787)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentActivity.doReallyStop(FragmentActivity.java:764)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:322)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at com.actionbarsherlock.app.SherlockFragmentActivity.onDestroy(SherlockFragmentActivity.java:261)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at com.example.app.MyActivity.onDestroy(MyActivity.java:195)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.app.Activity.performDestroy(Activity.java:5273)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1110)
01-14 15:34:37.176: E/AndroidRuntime(3272):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3562)

【问题讨论】:

能不能要源码? 【参考方案1】:

经过更多调试后,我发现异常发生是因为在调用onActivityCreated() 之前使用了getActivity()——此外,在getActivity() 上调用了一个方法,并且该方法依赖于已创建的活动。 /白痴

【讨论】:

你知道你调用的哪个方法依赖于正在创建的活动吗?【参考方案2】:

也许你正在以这样一种方式存储字符串,当片段进入后台时它不会被保存?没有代码,这是我能提供的唯一猜测。

解决问题的一种方法是简单地在 onActivityCreated 方法中进行空检查。不过,这取决于您要如何处理。

【讨论】:

以上是关于完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?的主要内容,如果未能解决你的问题,请参考以下文章

OnCreate 中的 AsyncTask 在运行时失败,如何在 Android 中避免这种情况?

如何使用 Android 缓存视图并避免每次都调用 onCreate

onCreate中的moveTaskToBack导致活动短暂显示然后隐藏

Android主要活动销毁(完成)自动

Android - 在不同活动之间切换时保存当前的 onCreate 状态

Android 11 onCreate() 调用每秒钟都丢失