2014-10-20 2 views
3

Я просто пытаюсь сохранить диалог по ориентации на Android, который, как я думал, будет простым. Но это не работает, как я думал. У меня есть простой класс членов моего Activity под названием StartMonitoringDialogFragment, который распространяется на DialogFragment. В моей деятельности я показываю это как:Android DialogFragment не сохраняется при изменении ориентации

StartMonitoringDialogFragment dialog = new StartMonitoringDialogFragment(); 
    dialog.show(getFragmentManager(), getClass().getName() + "StartDialog"); 

Однако диалог не появляется при изменении ориентации. Я заметил, что фрагменты onCreateView правильно вызываются после изменения ориентации и правильно создают и возвращают его представление (переменные экземпляра фрагмента все еще установлены), однако ничего не отображается. Разве это не должно отображаться? мне нужно отслеживать его вручную?

Редактировать Я попытался решить эту проблему путем добавления

Fragment dialog; 
    if(savedInstanceState != null && (dialog = getFragmentManager().findFragmentByTag(getClass().getName() + "StartDialog")) != null) { 
     ((DialogFragment)dialog).show(getFragmentManager(), getClass().getName() + "StartDialog"); 
    } 

к моей деятельности onCreate(Bundle savedInstanceState) метод, и он изначально, казалось, работал, однако сейчас я постоянно сталкивается исключение java.lang.IllegalStateException: Fragment already added. Любые идеи, что делать?

ответ

3

Это known issue, который почему-то встречается даже без поддержки библиотеки.

В любом случае, один обходной путь, который я нашел работу, добавляет это к каждому DialogFragment у вас есть (или базовой один, что все будет распространяться, конечно):

@Override 
public void onDestroyView() { 
    //workaround for this issue: https://code.google.com/p/android/issues/detail?id=17423 (unable to retain instance after configuration change) 
    if (getDialog() != null && getRetainInstance()) 
     getDialog().setDismissMessage(null); 
    super.onDestroyView(); 
} 
Смежные вопросы