无法销毁 activity: java.lang.IllegalArgumentException: 找不到片段的 id () 视图

Unable to destroy activity: java.lang.IllegalArgumentException: No view found for id () for fragment

我有一个 activity YYYY(扩展了一个片段)扩展了一个基础 activity XXXX,它又扩展了 ActionBarActivity。 我现在根据某些条件在 XXXXonCreate() 方法中调用 finish()(在最顶部)。 但我在下面得到了例外。请帮助我。

PS:我在finish();之后调用return;,这样onCreate()的其余部分就不会被执行。

07-26 16:46:26.902  14569-14569/E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to destroy activity {XXXXXXXXXXXXXX}: java.lang.IllegalArgumentException: No view found for id 0x7f0c01ec (XXXXXXXX) for fragment XXXXXXXXXXXXXX{2c85cf32 #2 id=0x7f0c01ec}
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3758)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3776)
    at android.app.ActivityThread.access00(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5312)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0c01ec (XXXXXXXXXXX) for fragment XXXXXXXXXXXXXXX{2c85cf32 #2 id=0x7f0c01ec}
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:945)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
    at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1963)
    at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:313)
    at android.support.v7.app.ActionBarActivity.onDestroy(ActionBarActivity.java:166)
    at XXXXXXXXXXXXXXXXXXX.onDestroy(XXXXXXXXXXXX.java:100)
    at android.app.Activity.performDestroy(Activity.java:6132)
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1163)
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3745)
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3776)
    at android.app.ActivityThread.access00(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5312)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

如果您从 onCreate() 调用 finish() 这并不意味着没有调用 onStart 和 onResume (activity 实际上是 onFinishing)。 要解决您的问题,您应该在 onStart 和 onResume 调用 isFinishing() ,如果它是真的,那么从那一点开始 return。

在 setContentView() 之后添加 finish()

好的,我找到问题所在了。第一次调用 finish() 时效果很好。当应用程序被系统杀死并重新创建时,就会出现问题。如果它只是一个正在重新创建的 activity,则在 setContentView() 之后调用 finish() 可以正常工作。

但是如果 activity 中有一些碎片膨胀,那么当这个特定的 activity 被杀死时,Android 也会存储碎片的状态。但它不会将其保存在 FragmentManager 中,而是保存在一个不同的列表中。所以当 activity 被重新创建时, Android 已经知道片段是什么。因此我们不能在膨胀片段之前简单地销毁它。如果我们这样做,我们会在 onDestroy()

期间得到异常

所以调用 finish() 的理想位置不仅在 setContentView() 之后,而且在片段的 onCreateView() 之后。因此,我在 activity 的 onResume() 中调用了 finish()。一切正常。

虽然我找到了解决方案,但我似乎找不到如何清除 Android 在重新创建 activity 时维护的片段历史记录列表。如果我可以清除该列表,那么我可以在 onCreate() 本身中调用 finish()。这是我仍在寻找的东西。