DialogFragment с setRetainInstanceState(true) не отображается после поворота устройства

У меня есть вопрос относительно DialogFragment. Я пытаюсь сделать диалог, который сохраняет его состояние после поворота устройства. В этом диалоговом окне есть несколько ссылок на такие вещи, как адаптеры и другие более тяжелые объекты, и мне нужно, чтобы это сохранялось при повороте, если это возможно, без необходимости делать каждую ссылку Parcelable или Serializable, чтобы я мог использовать onSaveInstanceState для сохранения и восстановления их, когда оригинальная деятельность воссоздана.

Я заметил, что в DialogFragment есть метод setRetainInstance (boolean), который позволяет сохранить экземпляр фрагмента диалога при повторном создании действия. Однако, когда я поворачиваю устройство сейчас, диалоговое окно больше не отображается. Я знаю, что могу получить его из FragmentManager действия, но не могу найти способ сделать его снова видимым. Есть предложения по этому поводу?

Спасибо михай

2 ответа

Решение

Есть несколько вещей, которые вам нужно сделать:

  1. используйте метод фабрики экземпляров, чтобы инициировать экземпляр DialogFragment следующим образом:

    public static MyDialogFragment newInstance(MyModel model) {
        MyDialogFragment myDialogFragment = new MyDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("MODEL", model);
        myDialogFragment .setArguments(bundle);
        return myDialogFragment;
    }
    
  2. поместив setRetainInstance (true) в onCreate, все ваши ссылки, объявленные во фрагменте, будут сохранены после повторного создания исходного действия

    @Override
    public void onCreate(Bundle icicle) {
        this.setCancelable(true);
        setRetainInstance(true);
        super.onCreate(icicle);
    
    }
    
  3. избегая исчезновения при вращении, делая это

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance())
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    

    }

  4. получить свой объект с помощью

    (MyModel) getArguments().getSerializable("MODEL")
    

Фрагмент диалога должен сохраняться автоматически при условии, что вы делаете следующее:

  1. Если вы вызываете Activity для onSaveInstanceState(), убедитесь, что вы вызываете суперфункцию !!!!, В моем случае это был ключ. Также убедитесь, что вы делаете то же самое во фрагменте.
  2. Если вы используете setRetainInstance, вам нужно вручную сохранить значения. В противном случае вы должны быть в состоянии не беспокоиться об этом, в большинстве случаев. Если вы делаете что-то более сложное, вам может понадобиться setRetainInstance(true), но в противном случае игнорируйте это.
  3. Некоторые люди жаловались на ошибку в библиотеке поддержки, когда сообщение об отклонении отправляется, когда этого не должно быть. Последняя библиотека поддержки, кажется, исправила это, так что вам не нужно беспокоиться об этом.
Другие вопросы по тегам