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

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

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

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

Спасибо, Mihai

4b9b3361

Ответ 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), но в противном случае игнорировать его.
  • Некоторые люди жалуются на ошибку в библиотеке поддержки, где отправляется сообщение об увольнении, когда этого не должно быть. Последняя библиотека поддержки, похоже, исправила это, поэтому вам не стоит беспокоиться об этом.