Почему некоторые AlertDialogs исчезают при вращении устройства? - PullRequest
1 голос
/ 18 января 2012

Когда я меняю ориентацию устройства, если был показан AlertDialog, он исчезает. Это верно для всех диалогов, кроме одного, в моем приложении, и я не могу понять, что такого особенного в том, что не исчезает, и как противодействовать этому поведению. Любая возможность сохранить диалоги при смене ориентации (кроме ручного управления)?

Ответы [ 6 ]

8 голосов
/ 19 мая 2014

Вы также можете переопределить метод onSaveInstanceState и сохранить флаг, указывающий, отображался ли ваш диалог при изменении ориентации. Затем вы можете вернуть этот флаг из пакета в onCreate и при необходимости перезапустить диалог.

@Override
protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);

    // Save the state so that it can be restored in onCreate or onRestoreInstanceState
    state.putBoolean("dialog_showing", dialog_showing);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    ...

    if(savedInstanceState != null && savedInstanceState.getBoolean("dialog_showing", false)) {
        // Show your dialog again
        ...
    }

    ...
}

EDIT:

Вместо восстановления вашего состояния в onCreate вы также можете переопределить метод onRestoreInstanceState. Он вызывается после onStart и будет вызываться только в том случае, если пакет не равен нулю; так что вам не нужно выполнять проверку на ноль в связке, как в методе onCreate.

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if(savedInstanceState.getBoolean("dialog_showing", false)) {
        // Show your dialog again
        ...
    }
}
4 голосов
/ 18 января 2012

Как полагают многие здесь,

android:configChanges="keyboardHidden|orientation"

не является решением. Это в лучшем случае взломать. Правильный способ справиться с этим - управлять диалогами с помощью своей деятельности. Вам нужно переопределить несколько методов в коде активности, например:

protected Dialog onCreateDialog(int id) {
    // create and return your dialog instance here
    AlertDialog dialog = new AlertDialog.Builder(context)
        .setTitle(title)
        .setIcon(R.drawable.indicator_input_error)
        .setMessage(message)
        .create();
    dialog.setButton(
            DialogInterface.BUTTON_POSITIVE,    
            context.getString(R.string.OK),
            (DialogInterface.OnClickListener) null);
    return dialog;
}

protected void onPrepareDialog(int id, Dialog dialog) {
    // You dialog initialization code here
}

После того, как вы закончите с этим. Вы показываете свой диалог, используя:

showDialog(yourDialogID);

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

Примечание из документации по Android SDK: Следует избегать использования этого атрибута и использовать его только в качестве крайней меры. Пожалуйста, прочитайте Обработка изменений времени выполнения для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации.

0 голосов
/ 18 января 2012

когда вы поворачиваете ваше устройство, оно возобновляет вашу деятельность, поэтому ваш диалог исчезает, чтобы решить эту проблему, просто включите следующие атрибуты в ваш android-manifest xml

android:configChanges="keyboardHidden|orientation"
0 голосов
/ 18 января 2012

Я думаю, вероятно, потому что метод OnCreate вызывается при изменении ориентации и снова создается активность, поэтому диалог исчезает.

0 голосов
/ 18 января 2012

Это потому, что активность перезапускается при повороте устройства.

Если вы добавляете тег

android:configChanges="keyboardHidden|orientation"

к каждому действию, которое не хотите перезапускать при изменении конфигурации, добавьте следующий тег.

0 голосов
/ 18 января 2012

Я думаю, может быть, вам нужно взять

android:configChanges="keyboardHidden|orientation"

в основной праздник вашей деятельности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...