发生onClick事件时更改对话框的内容

时间:2012-06-20 13:13:22

标签: android dialog alertdialog

在我的应用程序中,我创建了一个接受密码的对话框。在对话框中,存在一条消息,一个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;
}

2 个答案:

答案 0 :(得分:2)

我认为这里有两个问题。

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

    builder.setNeutralButton(...);
    

    按下时不会关闭对话框。

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

    dialog.setMessage("WRONG PASSWORD");
    
  3. 我认为

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

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

    修改

    AlertDialog类肯定有一个setMessage()方法。 see the docs here。它位于文档页面的底部附近,因此当您正确单击链接时,它不会将其滚动到顶部。但它就在那里,对我来说,从第三位下来。在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的Inner类,如下所示:

    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");
            }
        }
    }
    

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

答案 1 :(得分:0)

虽然 Tim 提供的答案是正确的,但我仍然会发布我的答案,以帮助那些希望将来有更多替代答案的人。

经过长时间的搜索,我通过覆盖 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;
}