为什么一些AlertDialogs会在设备轮换时消失?

时间:2012-01-18 13:37:05

标签: android user-interface

当我更改设备方向时,如果显示AlertDialog,它将消失。对于我的应用程序中除了一个对话框之外的所有对话框都是如此,我无法弄清楚对于那些没有消失的对话以及如何抵消这种行为的特别之处。在方向改变时保留对话的任何可能性(手动管理除外)?

6 个答案:

答案 0 :(得分: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
        ...
    }

    ...
}

修改

您可以覆盖onCreate方法,而不是在onRestoreInstanceState中恢复您的状态。它在onStart之后调用,只有在bundle不为null时才会被调用;因此,您不必像在onCreate方法中那样对包进行空检查。

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

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

答案 1 :(得分: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);

完成此操作后,您将看到如果发生配置更改,还会重新创建对话框。最好的部分是您的Activity将为您管理对话。它将在可能的情况下重用,如果执行大量初始化,则会减少对话框加载时间。

  

<强> Note from Android SDK documentation:   应避免使用此属性,并仅将其用作最后手段。有关如何通过配置更改正确处理重新启动的更多信息,请阅读处理运行时更改。

答案 2 :(得分:0)

我想可能因为OnCreate方法在方向更改时调用,并且再次创建了活动,因此对话框消失。

答案 3 :(得分:-4)

我想也许你必须采取

android:configChanges="keyboardHidden|orientation"

在您的活动中

答案 4 :(得分:-4)

因为旋转设备时活动正在重新启动。

如果你添加

android:configChanges="keyboardHidden|orientation"

标记您不希望在配置更改时重新启动的每个活动添加以下标记。

答案 5 :(得分:-5)

当您旋转设备时,它会重新启动您的活动,这就是您的对话框消失以解决此问题的原因,只需在您的android-manifest xml中包含以下属性

android:configChanges="keyboardHidden|orientation"