2012-01-18 6 views
1

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

ответ

4

Как было предложено много людей здесь,

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); 

После того, как вы закончите реализации этого your'll увидеть, что ваш диалог также будет воссоздан, если происходят изменения конфигурации. Лучше всего то, что ваш Activity будет управлять вашим диалоговым окном для вас. Он будет использоваться повторно, когда это возможно, уменьшая время загрузки диалогового окна, если вы выполняете большую инициализацию.

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

+0

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

+0

Кстати, 'android: configChanges =" orientation "' отлично работает, что за улов? Я читал об этом, но все еще не совсем понимаю возможные недостатки. –

+1

Если вы используете этот атрибут, вы говорите андроиду не воссоздавать свою активность при изменении ориентации. Это не андроидный путь AFAIK. Подробнее см. Http://developer.android.com/guide/topics/manifest/activity-element.html#config. Есть особое замечание об исключении этого метода. Кроме того, вы можете вернуть диалог оповещения, созданный с помощью AlertDialog.Builder, используя метод, описанный выше. –

-3

я думаю, может быть, вы должны принять

android:configChanges="keyboardHidden|orientation" 

в MainFest вашей деятельности

-3

Its becuase деятельности перезагружается при повороте устройства.

Если добавить

android:configChanges="keyboardHidden|orientation" 

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

-3

Возможно, вы вызывали в этом диалоговом окне setCancelable(true). Но не уверен, что это может повлиять на поведение диалога.

0

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

+0

Хорошая точка. Тег в моем ответе ниже устранит эту проблему. –

-4

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

android:configChanges="keyboardHidden|orientation" 
8

Вы также можете переопределить метод 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 и будет вызываться только в том случае, если пакет не равен NULL; поэтому вам не нужно выполнять нулевую проверку пакета, как в методе onCreate.

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

    if(savedInstanceState.getBoolean("dialog_showing", false)) { 
     // Show your dialog again 
     ... 
    } 
} 
+0

Это, вероятно, правильный способ сделать это, спасибо. –

+0

Определенно лучшее решение при соблюдении жизненного цикла естественной деятельности. Просто не забудьте определить глобальную переменную для 'AlertDialog' и отпустите ее' onDestroy() ', чтобы предотвратить утечку окон. –

Смежные вопросы