Android模式对话框堆叠

时间:2012-06-20 12:10:44

标签: java android xml user-interface

我的目标是在用户导航回我的应用时显示模式对话框。此模式对话框要求他们输入他们定义的6位数PIN。我是Java GUI和Android开发的新手,所以我的问题是......

我发现如果用户选择在显示enterpin对话框时最小化应用程序,如果他们返回到应用程序,则对话框会叠加在一起。让他们在最小化时输入他们的PIN码并在PIN输入期间返回到应用程序。

/**
 * On restart called when the app is being restarted on the screen
 */
@Override
public void onRestart() {
    super.onRestart();



    // must prompt with modal dialog for pin

    final Dialog dialog = new Dialog(this);

    dialog.setCancelable(false);

    // check pin
    dialog.setCanceledOnTouchOutside(false);
    // set view to enterpin XML screen
    dialog.setContentView(R.layout.enterpin);


    // show dialog
    if (!dialog.isShowing()) {
        dialog.show();
    }
    // listen for button being clicked
    Button button = (Button) dialog.findViewById(R.id.pinlogin);
    button.setOnClickListener(new OnClickListener() {// anonymous inner
        // class
        // implementation
        @Override
        public void onClick(View v) {
            EditText editText = (EditText) dialog
                    .findViewById(R.id.enterpintext);
            try {
                int enteredPin = Integer.parseInt(editText.getText()
                        .toString());
                SharedPreferences sharedP = Prefs.get(WebViewActivity.this);
                int temp = sharedP.getInt("pin", 0);
                if (enteredPin == temp) {
                    pinCheck = true;



                    dialog.dismiss();
                } else {
                    pinCheck = false;
                    dialog.setTitle("Incorrect Pin");
                }
            } catch (NumberFormatException e) {
                Dialog dialog2 = new Dialog(WebViewActivity.this);
                dialog2.setTitle("Enter Numbers Only");
                dialog2.setCanceledOnTouchOutside(true);
                dialog2.show();
            }
        }
    });

}

在某些地方我可以移动我的Dialog初始化而不觉得它是不好的编程习惯吗?我理解为什么我尝试的dialog.isShowing()方法不起作用,因为我的Dialog实例仅在方法的生命周期中存在。

我还注意到,如果你将手机从垂直方向转到水平方向90度,而另一方面,我的对话框就会消失。有人可以指出在强制重绘时调用的方法链,以便重新绘制对话框吗?

2 个答案:

答案 0 :(得分:2)

我相信您正在寻找onResume(); + onPause();而不是onRestart();来创建对话框。您应该使用onRestart();为要显示的PIN对话框设置标志,但不能创建对话框。

我建议您将其移至onCreate();方法,将其设置为您正在处理的活动的属性,并将其显示在onResume();方法中(因为它始终会被调用)每次活动都是活跃的,即使是第一次。)

此外,当方向发生变化时,您需要列出要收听方向更改事件(通过活动清单中的android:configChanges="orientation"),并在活动状态上调用onConfigurationChanged();方法具有相应数据的活动。然后,您可以将对话框重绘为新方向。

答案 1 :(得分:1)

我通过对话存储在活动的属性中来解决相同的问题(引脚输入或其他方面),每当我显示一个对话框时,我都会使用这些内容:

protected android.app.Dialog onCreateDialog(int id) {
        if (this.currentDialog != null) {
            this.currentDialog.dismiss();
        }

        this.currentDialog = null;

        switch (id) {
            case DIALOG_SPINNER:
                ProgressDialog progressDialog = new ProgressDialog(this);
                progressDialog.setMessage(getString(R.string.dialog_Spinner_UpdatingAccount));
                progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

                this.currentDialog = progressDialog;
                break;
        }

        return this.currentDialog;

    }

当活动离开堆栈顶部(导航或退出)时,我也会处理当前对话框。

@Override
    public void onPause() {
        if (this.currentDialog != null) {
            this.currentDialog.dismiss();
        }

        super.onPause();
    }

onPause方法允许您在暂停活动时关闭任何已打开的对话框,这样现有的onRestart代码就会显示一个新对话框。