Android OnCreate对话框和屏幕旋转

Android OnCreate对话框和屏幕旋转,android,android-alertdialog,oncreate,screen-rotation,Android,Android Alertdialog,Oncreate,Screen Rotation,我的活动的onCreate()中有一个alertDialog,用于设置活动的某些属性 public class MyActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myactiv

我的活动的onCreate()中有一个alertDialog,用于设置活动的某些属性

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("My Dialog");
        alertDialogBuilder
            .setCancelable(false)
            ...

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
}
启动活动时,对话框将启动,提交对话框后,将设置属性并关闭对话框。到目前为止还不错

但是,如果此时(提交/取消对话框后),我旋转设备/屏幕,将再次调用onCreate()并再次打开对话框(我不希望这样)


如何防止在屏幕旋转时打开对话框?或者我应该在其他地方创建对话框(不在活动的onCreate()中)?

您的问题是每次旋转屏幕时调用
onCreateMethod
,您可以覆盖
onSaveInstanceState
方法来保存当前布局的实例

boolean isSubmited=false;
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putBoolean(isSubmited, true);


// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
现在,当您提交对话框时,将
isSubmited
更改为true,然后键入

if(isSubmited)
alertDialog.show();

参考

您的问题是每次旋转屏幕时调用的
onCreate方法
,您可以覆盖
onSaveInstanceState
方法来保存当前布局的实例

boolean isSubmited=false;
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putBoolean(isSubmited, true);


// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
现在,当您提交对话框时,将
isSubmited
更改为true,然后键入

if(isSubmited)
alertDialog.show();

参考

基于巴兹尔·巴蒂基的解决方案,我最终做了以下工作:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    // save whether dialog has been submitted
    savedInstanceState.putBoolean("isSubmitted", isSubmitted);

    super.onSaveInstanceState(savedInstanceState);
}

@Override
protected void onPause() {
    super.onPause();
    if ( alertDialog != null ) {
        alertDialog.dismiss(); // prevent window leak when screen is rotated while dialog shown
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // check whether activity is recreated or created for the first time
    if( savedInstanceState != null ) { 
        // recover information on whether dialog was submitted
        isSubmitted = savedInstanceState.getBoolean("isSubmitted");
    }

    alertDialogBuilder.setPositiveButton("Start", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                ...
                isSubmitted=true;
                })}

    if ( !isSubmitted ) {
        alertDialog.show();
    }

根据Basil Battikhi的解决方案,我最终做了以下工作:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    // save whether dialog has been submitted
    savedInstanceState.putBoolean("isSubmitted", isSubmitted);

    super.onSaveInstanceState(savedInstanceState);
}

@Override
protected void onPause() {
    super.onPause();
    if ( alertDialog != null ) {
        alertDialog.dismiss(); // prevent window leak when screen is rotated while dialog shown
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // check whether activity is recreated or created for the first time
    if( savedInstanceState != null ) { 
        // recover information on whether dialog was submitted
        isSubmitted = savedInstanceState.getBoolean("isSubmitted");
    }

    alertDialogBuilder.setPositiveButton("Start", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                ...
                isSubmitted=true;
                })}

    if ( !isSubmitted ) {
        alertDialog.show();
    }

非常感谢您的解决方案。语法略有不同,所以我在下面发布了我的实现。非常感谢您提供的解决方案。语法略有不同,所以我在下面发布了我的实现。