Экран системы, запущенный с намерения, не выдерживает изменения ориентации - PullRequest
0 голосов
/ 19 февраля 2020

В моем приложении android я хочу сохранить контакты в адресной книге через Intent. Намерение работает просто отлично. Однако следующий экран (выберите, в какой адресной книге должен быть сохранен контакт) не переносит изменение ориентации действия, и устройства возвращаются в мое приложение.
По сути, мой пользователь должен нажать кнопку «Сохранить контакт». "снова, и снова отображается системный экран.
Чего я хочу добиться, так это того, что этот системный экран не будет уничтожен изменением ориентации.

В случае, если мой Engli sh подвел меня, вот скриншот:

enter image description here

1 Ответ

1 голос
/ 19 февраля 2020

Я не знаю, сможете ли вы избежать уничтожения экрана, поскольку система должна воссоздать его, чтобы соответствовать измененным размерам экрана.
Но вы могли бы реализовать это после того, как убили экран во время изменения ориентации, и вы сразу же открыли снова (возможно, даже предварительно заполненный данными, которые он содержал ранее).

Как построить этот обходной путь

Вы можете хранить в своей активности некоторую булеву переменную, например 'isDialogActive', которую вы устанавливаете в true, когда диалог открывается, и в значение false, когда диалог закрывается.

Далее вы можете сохранить это логическое значение в Bundle в функции жизненного цикла onSaveInstanceState.

protected void onSaveInstanceState(Bundle bundle) {
   super.onSaveInstanceState(bundle);
   bundle.putBoolean("is_dialog_active", this.isDialogActive);
}

Так что теперь, когда ваша ориентация меняется, вы можете безопасно узнать, был ли диалог активен до поворота или нет. набор. Этот Пакет переживает изменение ориентации и после изменения передается в onCreate. Теперь мы можем использовать эту информацию (Пакет), когда действие воссоздается в функции жизненного цикла onCreate.

@Override
protected void onCreate(Bundle bundle) {
    boolean dialogWasActiveBeforeChange = 
             bundle.getBoolean("is_dialog_active")

    if ( dialogWasActiveBeforeChange){
       //use your logic that opens the dialog ( that logic should also set 
       // this.isDialogActive to true )
    }
}
...