DialogFragment с setRetainInstanceState (true) не отображается после поворота устройства
У меня есть вопрос относительно DialogFragment. Я пытаюсь сделать диалог, который будет поддерживать его после поворота устройства. В этом диалоговом окне есть куча ссылок на такие вещи, как адаптеры и другие более тяжелые объекты, и мне нужно, чтобы это поддерживалось при вращении, если возможно, без необходимости делать каждую ссылку Parcelable или Serializable, чтобы я мог использовать onSaveInstanceState для сохранения и восстановления, когда первоначальная активность воссоздается.
Я заметил там метод, называемый setRetainInstance (boolean) в диалоговом окне DialogFragment, который позволяет сохранить экземпляр фрагмента диалога при повторной создании активности. Однако, когда я поворачиваю устройство сейчас, диалог больше не отображается. Я знаю, что могу получить его из действия FragmentManager, но я не могу найти способ сделать его видимым снова. Любые предложения по этому поводу?
Спасибо,
Mihai
Ответы
Ответ 1
Есть несколько вещей, которые вам нужно сделать:
-
использовать экземпляр factory метода для запуска экземпляра 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")
Ответ 2
Диалоговое окно диалога должно сохраняться автоматически до тех пор, пока вы выполните следующее:
- Если вы вызываете Activity onSaveInstanceState(), , убедитесь, что вы вызываете суперфункцию!!!!. В моем случае это был ключ. Также убедитесь, что вы делаете то же самое во Фрагменте.
- Если вы используете
setRetainInstance
, вам необходимо вручную сохранить значения. В противном случае вы сможете не беспокоиться об этом, в большинстве случаев. Если вы делаете что-то более сложное, вам может понадобиться setRetainInstance(true)
, но в противном случае игнорировать его.
- Некоторые люди жалуются на ошибку в библиотеке поддержки, где отправляется сообщение об увольнении, когда этого не должно быть. Последняя библиотека поддержки, похоже, исправила это, поэтому вам не стоит беспокоиться об этом.