【问题标题】:OnCreate dialog and screen rotationOnCreate 对话框和屏幕旋转
【发布时间】:2016-03-07 12:35:01
【问题描述】:

我的活动的 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() 中)?

【问题讨论】:

    标签: android android-alertdialog oncreate screen-rotation


    【解决方案1】:

    您的问题是每次旋转屏幕时都会调用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();
    

    参考http://developer.android.com/training/basics/activity-lifecycle/recreating.html

    【讨论】:

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

    根据 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多