我有一个带有LinearLayout片段容器的主要抽屉活动,在该容器中我在应用程序上加载了不同状态的片段,这里的问题是这种异常的可能原因是什么,因为我是从崩溃解析日志中获取的,所以不知道重现场景,这是日志
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{me.com.mycompanydomain/me.com.mycompanydomain.ui.activities.MainActivity}: java.lang.IllegalStateException: No instantiated fragment for index #0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4921)
at android.app.ActivityThread.-wrap19(Unknown Source)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
如评论中所述,下面显示了其他日志,该日志显示它发生在MainActivity的onCreate中,但没有特定的方向,只是在Android 7上一次在三星设备上发生,而在Android 8上一次在三星设备上发生过
Caused by java.lang.IllegalStateException: No instantiated fragment for index #0
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:3097)
at android.support.v4.app.FragmentController.restoreAllState(FragmentController.java:149)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:306)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
at me.com.mycompanydomain.ui.activities.NavDrawerActivity.onCreate(NavDrawerActivity.java:138)
at me.com.mycompanydomain.ui.activities.MainActivity.onCreate(MainActivity.java:180)
at android.app.Activity.performCreate(Activity.java:6955)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4978)
at android.app.ActivityThread.-wrap21(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1648)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
编辑(片段操作详细信息)
MainActivity
正在loadCurrentFragment();
内部呼叫onCreate
private void loadCurrentFragment() {
mCurrentFragment = getSupportFragmentManager().findFragmentByTag(CURRENT_FRAGMENT_TAG);
if (mCurrentFragment == null) {
if(mAppState.getActiveNewsArticle() != null) {
mCurrentFragment = new NewsArticleFragment();
changeFrag();
}
else if (mAppState.getActiveChannel() != null) {
mCurrentFragment = new ChannelFragment();
changeFrag();
}
}
}
private void changeFrag() {
if (mCurrentFragment != null && !isFinishing()) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.frag_container, mCurrentFragment, CURRENT_FRAGMENT_TAG)
.disallowAddToBackStack()
.commitAllowingStateLoss();
}
}
还在onResume
内使用以下代码
if (mAppState.getActiveNewsArticle() != null && !(mCurrentFragment instanceof NewsArticleFragment)) {
mCurrentFragment = new NewsArticleFragment();
changeFrag();
}
else if (mAppState.getActiveChannel() != null && !(mCurrentFragment instanceof ChannelFragment)) {
mCurrentFragment = new ChannelFragment();
changeFrag();
}
在这些位置旁边,有一些EventBus
方法onEventMainThread
可以检查当前片段是否不是所需的操作,然后用所需的方法加载当前片段。片段不会被删除,只会被替换,而上面提到的每个加载的片段也具有嵌套片段。