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

时间:2015-07-26 11:33:31

标签: android android-fragments illegalargumentexception ondestroy

我有一个活动YYYY(扩展一个片段),扩展了一个基本活动XXXX,后者又扩展了ActionBarActivity。 我现在根据某些条件在finish() onCreate()方法(最顶层)中调用XXXX。 但是我在下面得到了例外。请帮助我。

PS:我在return;之后致电finish();,以便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.access$1400(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.access$1400(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)

3 个答案:

答案 0 :(得分:3)

好的,我发现了问题所在。第一次调用finish()完美无缺。当应用程序被系统杀死并重新创建时,会出现此问题。如果它只是重​​新创建的活动,请在finish()之后调用setContentView()

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

期间获得例外

因此,调用finish()的理想位置不仅仅是在setContentView()之后,而且还在onCreateView()之后。因此,我通过在活动的finish()中调用onResume()来结束。事情很好。

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

答案 1 :(得分:0)

如果从 onCreate()调用 finish(),并不意味着onStart和onResume没有被调用(活动实际上是onFinishing)。 要修复你的问题你应该在onStart和onResume上调用isFinishing(),如果是真的那么从那一点返回。

答案 2 :(得分:0)

在setContentView()

之后添加finish()