3

在我的应用程序中,我创建了一个对话框来接受密码。在对话框中存在一条消息、一个 EditText 和两个按钮(一个 +ve 和一个 -ve)。当用户单击 +ve 按钮时,我正在检查在 EditText 中输入的密码是否有效。如果无效,我必须更改提示用户重新输入密码的对话框的消息。

如果密码有效,它会按预期工作,但它是无效的,而不是更新消息,它只是关闭对话框。

我已经尝试通过覆盖onPrepareDialog()来解决它,但它也不起作用。

这是我的代码:

protected Dialog onCreateDialog(int viewId){
    AlertDialog dialog = null;
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Enter Password To Continue");
            final EditText passwordField = new EditText(getApplicationContext());
            builder.setView(passwordField);
            builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    if(passwordField.getText().toString().equals("password")){
                        Intent intent = new Intent(MyFirstActivity.this, NextActivity.class);
                        finish();
                        startActivity(intent);
                    }else{
                            //Here I need to update the message
                        builder.setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again ");
                    }                       
                }
            });
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            dialog =  builder.create();
    }
    return dialog;
}
4

2 回答 2

2

我认为这里有两个问题。

  1. 如果我没记错,AlertDialog 上 PositiveButton 的默认行为将关闭对话框。我认为这就是为什么密码错误时您的关闭的原因。我想如果你切换到

    builder.setNeutralButton(...);
    

    按下时它不会关闭您的对话框。

  2. 您正在更改 Builder 上的消息,而不是 Dialog 本身。我不认为 Builder 会在 Dialog 已经创建和显示后动态改变它的外观。

    dialog.setMessage("WRONG PASSWORD");
    

我想会为你改变它。如果没有,那么您必须制作一个 TextView 并将其添加到您的 Dialog 中,builder.setView(mTxt);然后您可以调用setText();您的参考,它将更改屏幕上的文本。

我认为比任何一个更好的解决方案可能是Toast弹出窗口。用户刚刚输入了密码并按下了提交,所以我认为他们可以指望他们正在看屏幕。许多其他具有登录页面的应用程序使用 Toast 消息来告诉用户他们是否输入了错误的密码,所以我认为您不会混淆您的用户或任何东西,这是一种常见的设计模式。

编辑:

AlertDialog 类肯定有一个 setMessage() 方法。请参阅此处的文档。它位于文档页面的底部附近,因此当您正确单击链接时它不会滚动到顶部。但它就在那里,对我来说是从顶部向下的第三个。之间setInverseBackgroundForcedsetTitle

编辑2:

我实施了类似于您不久前尝试做的事情。我必须将自己的自定义侦听器对象与我认为的对话框按钮一起使用,以使它们在按下时不会隐藏对话框。

以下是我创建和显示对话框的方式:

  AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
  builder.setCancelable(false)
  .setMessage("Please Enter Something")

  .setPositiveButton("Enter", new DialogInterface.OnClickListener() {
       public void onClick(DialogInterface dialog, int id) {
        //All of the fun happens inside the CustomListener now.
        //I had to move it to enable data validation.
        }
   });
   AlertDialog alertDialog = builder.create();
   alertDialog.show();
   Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
   theButton.setOnClickListener(new CustomListener(alertDialog));

然后我在我的 Activity 中创建了一个名为 CustomListener 的内部类,如下所示:

class CustomListener implements View.OnClickListener {
    private final Dialog dialog;
    public CustomListener(Dialog dialog) {
        this.dialog = dialog;
    }
    @Override
    public void onClick(View v) {


        if(passwordField.getText().toString().equals("password")){
            //Password is correct.


        } else { //Password is incorrect.
            ((AlertDialog)dialog).setMessage("WRONG");
        }
    }
}

当您以这种方式设置侦听器时,它不会在按下按钮时自动关闭对话框。

于 2012-06-20T13:22:38.447 回答
0

虽然蒂姆提供的答案是正确的,但我仍然发布我的答案,以帮助将来想要更多替代答案的人。

经过长时间的搜索,我通过覆盖onShow()方法以另一种方式解决了这个问题。

@Override
protected Dialog onCreateDialog(int viewId){
    AlertDialog dialog;
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("Enter Password To Continue");
            final TextView message = new TextView(getApplicationContext());
            message.setText("Enter Password To Continue");
            builder.setView(message);

            final EditText passwordField = new EditText(getApplicationContext());
            builder.setView(passwordField);
            builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                        //Do Nothing
                                    }
            });
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            dialog =  builder.create();
            dialog.setOnShowListener(new OnShowListener() {

                @Override
                public void onShow(final DialogInterface dialog) {
                    // TODO Auto-generated method stub
                    Button b = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
                    b.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                       if(passwordField.getText().toString().equals("password")){
                                Intent intent = new Intent(PuzzleHome.this, PuzzleMaker.class);
                                startActivity(intent);
                            }else{
                                ((AlertDialog) dialog).setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again");
                            }
                        }
                    });
                }
            });
    }
    return dialog;
}
于 2012-06-21T06:01:56.467 回答