【问题标题】:Change the content of a dialog box when onClick event occursonClick 事件发生时改变对话框的内容
【发布时间】:2025-12-21 09:50:15
【问题描述】:

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

【问题讨论】:

    标签: android dialog android-alertdialog


    【解决方案1】:

    我认为这里有两个问题。

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

      builder.setNeutralButton(...);
      

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

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

      dialog.setMessage("WRONG PASSWORD");
      

    我想会为你改变它。如果没有,那么您必须创建一个 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 的内部类,如下所示:

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

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

    【讨论】:

    • 蒂姆,你的第一个建议是完全错误的,因为对话框没有 setMessage() 或类似的方法。我尝试了您的第二个建议,它更改了 textview 内容,但它立即关闭了对话框。即使在单击自然按钮“提交”后,您是否有任何想法使对话框可见。
    • 但是您使用的是 AlertDialog,而不是 Dialog。并且 AlertDialog 确实有 setMessage(),请参阅我的编辑以获取指向 javadoc 的链接。此外,我仍然认为 Toast 是比 setMessage() 或 TextView 更好的解决方案。
    • 我的客户还没有准备好听任何东西。所以我必须只用 Dialog 来实现这一点。第二件事是,它用 setMessage() 改变了消息,但对话框突然消失了。该怎么办?
    • 我不是通灵者,我无法了解您的客户。在您提供的代码中,您已经在使用 AlertDialog ... 如果您不允许使用 AlertDialog,那么您将不得不废弃您在问题中发布的几乎所有内容。这意味着您试图提出与您发布的问题完全不同的问题。
    • Tim 我想我无法解释我的话,因为我的英语很差。我的客户不允许我使用 Toast 显示消息。它说我必须通过仅更新 AlertDialog 的消息来解决它。但是在尝试了您的答案后,我成功更新了消息,但我的 AlertDialog 自动关闭。
    【解决方案2】:

    虽然 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;
    }
    

    【讨论】:

      最近更新 更多