2

Речь идет о повторяющейся проблеме, с которой я обнаружил, что мое приложение обращено, и связано с использованием пары DialogFragments. Я нацелен главным образом на устройства уровня 8, поэтому для использования DialogFragments мне пришлось использовать библиотеку совместимости.IllegalStateException после возврата к FragmentActivity

Проблема сама по себе возникает, когда я выхожу из приложения, и они возвращаются. Вот StackTrace:

12-22 14:56:05.819: W/dalvikvm(6384): threadid=1: thread exiting with uncaught exception (group=0x400207d8) 
12-22 14:56:05.949: E/AndroidRuntime(6384): FATAL EXCEPTION: main 
12-22 14:56:05.949: E/AndroidRuntime(6384): java.lang.IllegalStateException: Activity has been destroyed 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1269) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:529) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:102) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.view.ViewPager.populate(ViewPager.java:692) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:851) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.View.measure(View.java:8171) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:526) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.View.measure(View.java:8171) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.View.measure(View.java:8171) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:526) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.View.measure(View.java:8171) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.View.measure(View.java:8171) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.os.Looper.loop(Looper.java:123) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
12-22 14:56:05.949: E/AndroidRuntime(6384):  at dalvik.system.NativeStart.main(Native Method) 

А вот мой урезанная-к-минимум MainActivity.

public class MainActivity extends FragmentActivity{ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
... 
    public void showNewChannelFragmentDialog() { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 
     if (prev != null) { 
      ft.remove(prev); 
     } 
     ft.addToBackStack(null); 

     // Create and show the dialog. 
     NewChannelDialogFragment newFragment = NewChannelDialogFragment.newInstance(); 
     newFragment.setContext(this); 
     newFragment.show(ft,"dialog"); 
    } 
} 

Метод showNewChannelFragmentDialog() вызывается только тогда, когда пользователь выбирает конкретный пункт меню, так что я думаю, что содержание самой DialogFragment не имеет значения здесь.

Но вы можете видеть, что я точно показываю то, что показано here, и это действительно работает, проблема, о которой я говорил ранее, - это когда мое приложение возвращается к жизни после того, как пользователь оставил его.

Любые предложения? Я рассматриваю возможность удаления фрагментов и просто используя обычные диалоговые окна.

+0

Вы могли бы показать, где вы звоните showNewChannelFragmentDialog ?. Я предположил, что если вы прокомментируете содержание этого метода, у вас не будет ошибки при перезагрузке вашего приложения, не так ли? – jegumi

ответ

0

может быть, это не одна и единственная проблема, но вы должны вызвать

ft.add(newFragment); 
ft.commit(); //but at least this 

в конце вашей функции showNewChannelFragmentDialog().