Диалог DialogFragment теряет установленные свойства после изменения конфигурации

Я создал диалог прогресса, следуя новому «фрагментарному пути» с помощью этого кода:

public class DialogUpdateTrackRecords extends DialogFragment {

    public static DialogUpdateTrackRecords newInstance() {
        DialogUpdateTrackRecords frag = new DialogUpdateTrackRecords();
        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
    }

    @Override
    public ProgressDialog onCreateDialog(Bundle savedInstanceState) {
        this.setCancelable(false);
        ProgressDialog dialog= new ProgressDialog(getActivity());
        dialog.setTitle("Caricamento tragitti");
        dialog.setIndeterminate(true);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Sending something");

        return dialog;
    }
}

и я показываю это из такой деятельности:

FragmentManager fm= getSupportFragmentManager();
uploadDialogFrament= (DialogFragment) getSupportFragmentManager().findFragmentByTag("sendDialog");
if(uploadDialogFrament!=null)
    uploadDialogFrament.dismiss();
FragmentTransaction ft= fm.beginTransaction();

uploadDialogFrament= DialogUpdateTrackRecords.newInstance();
uploadDialogFrament.show(ft,"sendDialog");
fm.executePendingTransactions();
((ProgressDialog)uploadDialogFrament.getDialog()).setMax(trackRecordSize);
if( trackRecordSize > 1 )
    ((ProgressDialog)uploadDialogFrament.getDialog()).setIndeterminate(false);

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


person Bertuz    schedule 11.06.2013    source источник
comment
Я забыл сказать, что использую SherlockFragmentActivity. Я думаю, что это не должно повлиять на сохранение моего фрагмента, но... кто знает?   -  person Bertuz    schedule 11.06.2013


Ответы (2)


Ты пытался

setRetainInstance(true)

Поскольку DialogFragment расширяет базовый фрагмент, я уверен, что это сработает.

person Shaun    schedule 11.06.2013
comment
Ага! Я поставил setRetainInstance(true) в функцию onCreate фрагмента. Угадай, что? Если установлено, и вы поворачиваете экран, ФРАГМЕНТ ИСЧЕЗАЕТ (я имею в виду: диалог исчезает с экрана. Не уверен, что диалог все еще там). Так смешно, да? - person Bertuz; 11.06.2013
comment
Итак... хорошая новость заключается в том, что я нашел это, которое решает часть setretaininstance link. ПЛОХИЕ НОВОСТИ: несмотря на то, что setretaininstance имеет значение true, диалоговое окно не сохраняет свои новые настройки после его создания в onCreateDialog. - person Bertuz; 11.06.2013
comment
Что ж, затем используйте метод onSavedInstanceState(), создайте пакет, сохраните каждое значение для имеющихся у вас представлений (тексты редактирования и т. д.), а затем используйте super.onSavedInstanceState(bundle). Затем в методе onCreate получите значения из пакета и поместите их обратно в представления. - person Shaun; 11.06.2013
comment
Я думаю, что писал этот обходной путь в то время, когда вы комментировали прямо здесь :) Обходной путь работает, но это не совсем то поведение, которого мы могли ожидать. Я думаю, что это ошибка поддержки v4 (какая новость, я бы сказал) - person Bertuz; 12.06.2013

ОК .. это просто обходной путь, и я НЕ ПРЕДЛАГАЮ ЭТОГО. Несмотря на предупреждение: у меня действительно нет необходимого времени, чтобы вникать в логику этой ошибки, и я использовал этот простой обходной путь. Короче говоря: каждый раз, когда я возобновляю фрагмент диалога, я обновляю его со всеми настройками, которые он должен иметь автоматически. Вот пример:

public class DialogUpdateTrackRecords extends DialogFragment {
    private boolean indeterminate= true;

    public static DialogUpdateTrackRecords newInstance() {
        DialogUpdateTrackRecords frag = new DialogUpdateTrackRecords();
        return frag;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onResume() {
        super.onResume();

        ((ProgressDialog)getDialog()).setIndeterminate(indeterminate);
    }

    @Override
    public ProgressDialog onCreateDialog(Bundle savedInstanceState) {
        this.setCancelable(false);
        ProgressDialog dialog= new ProgressDialog(getActivity());
        dialog.setTitle("Caricamento tragitti");
        dialog.setIndeterminate(true);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Invio delle statistiche completate a ISF Modena in corso");
        return dialog;
    }


    public void setIndeterminate(){
        ((ProgressDialog)getDialog()).setIndeterminate(false);
        indeterminate= false;
    }



    /*
    [italian soh]
    http://stackoverflow.com/questions/12433397/android-dialogfragment-disappears-after-orientation-change
    thanks, google. Thanks.
    [/italian soh]
     */
    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }

}

В любом случае: если кто-нибудь найдет причину этого странного поведения, я был бы более чем счастлив правильно исправить свой код.

person Bertuz    schedule 11.06.2013