完成 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 【问题描述】:这很奇怪。我有一个简单的应用程序,一旦登录,它就会在活动中显示一个片段。该应用程序还有一个不活动“超时”,在此之后它完成活动并显示登录屏幕 - 如果应用程序在发生超时时处于后台,那么当活动中发生下一个 onCreate
或 onStart
事件时完成了。
但是,有时当返回登录的活动时,我会在片段的 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导致活动短暂显示然后隐藏