3

У меня есть деятельность YYYY (который раздувает фрагмент), который расширяет базовую активность XXXX, которая в свою очередь расширяет ActionBarActivity. Теперь я звоню finish() в onCreate() метод XXXX (на самом верху), основанный на некотором состоянии. Но я получаю исключение ниже. Пожалуйста, помогите мне.Невозможно не уничтожить активность: java.lang.IllegalArgumentException: Без вида найдено для идентификатора() для фрагмента

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

ОК, я обнаружил, что проблема есть. В первый раз вокруг звонка finish() работает отлично. Проблема возникает, когда приложение убивается системой и воссоздается. Если это просто активность, которая воссоздается, вызов finish() после setContentView() отлично работает.

Но если в действии есть несколько фрагментов, завышенных в нем, то когда эта конкретная деятельность будет убита, в Android также сохранятся состояния фрагментов. Но это не сохраняет это в FragmentManager, а скорее в другом списке. Поэтому, когда активность воссоздана, Android уже знает, что такое фрагменты. Следовательно, мы не можем просто просто уничтожить его до раздувания фрагмента. Если мы сделаем это, мы получим исключение во время onDestroy()

Так идеальное место, чтобы вызвать finish() не только после того, как setContentView(), но и после onCreateView() фрагментов. Таким образом, я закончил, набрав finish() в onResume() активности. Все отлично работает.

Хотя я нашел решение, я не могу найти, как очистить список истории фрагментов, поддерживаемый Android при обновлении активности. Если бы я мог очистить этот список, тогда я мог бы позвонить finish() в самом onCreate(). Это то, что я все еще ищу.

0

Если вы звоните отделка() от OnCreate() это не означает, что OnStart и onResume не вызывался (активность onFinishing на самом деле). Чтобы исправить проблему, вы должны вызывать isFinishing() в onStart и onResume, и если ее истина вернется с этой точки.

+0

У меня нет ничего в onStart и onResume. Я все еще сталкиваюсь с этим вопросом. – Henry

0

Добавить отделку() после setContentView()

+0

Спасибо, но это не решает мою проблему. – Henry