DialogFragment с setRetainInstanceState(true) не отображается после поворота устройства
У меня есть вопрос относительно DialogFragment. Я пытаюсь сделать диалог, который сохраняет его состояние после поворота устройства. В этом диалоговом окне есть несколько ссылок на такие вещи, как адаптеры и другие более тяжелые объекты, и мне нужно, чтобы это сохранялось при повороте, если это возможно, без необходимости делать каждую ссылку Parcelable или Serializable, чтобы я мог использовать onSaveInstanceState для сохранения и восстановления их, когда оригинальная деятельность воссоздана.
Я заметил, что в DialogFragment есть метод setRetainInstance (boolean), который позволяет сохранить экземпляр фрагмента диалога при повторном создании действия. Однако, когда я поворачиваю устройство сейчас, диалоговое окно больше не отображается. Я знаю, что могу получить его из FragmentManager действия, но не могу найти способ сделать его снова видимым. Есть предложения по этому поводу?
Спасибо михай
2 ответа
Есть несколько вещей, которые вам нужно сделать:
используйте метод фабрики экземпляров, чтобы инициировать экземпляр DialogFragment следующим образом:
public static MyDialogFragment newInstance(MyModel model) { MyDialogFragment myDialogFragment = new MyDialogFragment(); Bundle bundle = new Bundle(); bundle.putSerializable("MODEL", model); myDialogFragment .setArguments(bundle); return myDialogFragment; }
поместив setRetainInstance (true) в onCreate, все ваши ссылки, объявленные во фрагменте, будут сохранены после повторного создания исходного действия
@Override public void onCreate(Bundle icicle) { this.setCancelable(true); setRetainInstance(true); super.onCreate(icicle); }
избегая исчезновения при вращении, делая это
@Override public void onDestroyView() { if (getDialog() != null && getRetainInstance()) getDialog().setDismissMessage(null); super.onDestroyView();
}
получить свой объект с помощью
(MyModel) getArguments().getSerializable("MODEL")
Фрагмент диалога должен сохраняться автоматически при условии, что вы делаете следующее:
- Если вы вызываете Activity для onSaveInstanceState(), убедитесь, что вы вызываете суперфункцию !!!!, В моем случае это был ключ. Также убедитесь, что вы делаете то же самое во фрагменте.
- Если вы используете
setRetainInstance
, вам нужно вручную сохранить значения. В противном случае вы должны быть в состоянии не беспокоиться об этом, в большинстве случаев. Если вы делаете что-то более сложное, вам может понадобитьсяsetRetainInstance(true)
, но в противном случае игнорируйте это. - Некоторые люди жаловались на ошибку в библиотеке поддержки, когда сообщение об отклонении отправляется, когда этого не должно быть. Последняя библиотека поддержки, кажется, исправила это, так что вам не нужно беспокоиться об этом.