如何通过代码点击AlertDialog上的“确定”按钮?

12

我在Activity中使用showDialogdismissDialog来显示和销毁我的对话框。是否还有一种方法可以在当前显示的对话框上发出点击命令,而无需保留引用对话框的变量?

例如,我想通过代码按下对话框中的“确定”/正面按钮。


你是否正在使用构建器来设置对话框? - TronicZomB
@TronicZomB:是的,我正在使用Builder,并且我正在Activity中重写onCreateDialog来设置我的对话框。 - Arci
1
好的,bakriOnFire提供了一个非常好的例子,这正是我在注意到他的回答之前要发布的内容。那基本上就是你想要模仿你的代码的样子。 - TronicZomB
@TronicZomB:我觉得他误解了我的问题。我知道如何设置对话框以及如何显示和关闭它。我的问题是,如何通过代码触发它的点击事件,考虑到我没有对话框变量的引用。 - Arci
嗯...好的,我想我明白你的意思了...祝你好运! - TronicZomB
4个回答

32

我没有测试过这段代码,但它应该可以工作:

AlertDialog dialog = ...
dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();

或者,如果您不想保留对对话框的引用但是可以控制其设置,您可以将单击代码提取到另一个方法中:

AlertDialog.Builder builder = ...
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int which) {
    onPositiveButtonClicked(); 
  }
});

在您的Activity中实现onPositiveButtonClicked()。不要通过编程方式单击“确定”按钮,而是可以调用onPositiveButtonClicked()dismissDialog(id)。如果您需要处理多个对话框,请使onPositiveButtonClicked接受一个id参数。


谢谢,但是我正在使用Builder,它没有getButton方法。有没有一种方法可以在不保留实际对话框引用的情况下点击“确定”按钮? - Arci
4
如果您能够保留对话框的引用,AlertDialog实例将通过AlertDialog.Builder#show()返回。否则,是否可以将点击逻辑移动到单独的方法中?而不是模拟点击,您可以直接执行单击代码并关闭对话框。 - Matt Giles
是的,它返回一个 AlertDialog,但我不喜欢保留引用 AlertDialog 的变量。如果我有对话框的ID,有没有一种方法可以使用给定的 Activity 访问对话框? - Arci
我理解你的问题,但我不知道如何做。API似乎并不容易实现;如果无法将单击逻辑和关闭对话框分离,则保留对话框的引用可能是最简洁的方法。如果您找到了一个好的方法,请发布出来。我很感兴趣 :) - Matt Giles
我找不到一种简单的方法来访问当前在Activity上显示的对话框。最终,我采用了您的解决方案来保存AlertDialog的引用,并使用dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick()触发积极按钮。谢谢! - Arci

5
我可以帮您将对话框中的“确定”/“正面”按钮通过代码进行点击。您可以获取“正面”按钮的实例,然后调用performClick()方法。请尝试以下代码:
Button okButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
okButton.performClick(); //<<< click Button using code

谢谢!但是如果我没有对“变量”的引用,有没有一种只使用“Activity”就可以访问“POSITIVE”按钮的方法(类似于“dismissDialog”)? - Arci

1
如果您正在使用Builder,则没有getButton()函数。您可以尝试这个。
AlertDialog.Builder alBuilder = new AlertDialog.Builder(this);
alBuilder.setMessage("Test Message")
         .setPositiveButton("Yes", null)
         .setNegativeButton("No",null)
alBuilder.setCancelable(false);
AlertDialog alertDialog = alBuilder.show();

然后,您可以通过以下代码访问按钮。
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();

-1

试试这个:

AlertDialog.Builder alBuilder = new AlertDialog.Builder(this);
        alBuilder
                .setMessage("Do you wamt to exit?")
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.cancel();
                                // Write your code here for Yes
                            }
                        })
                .setNegativeButton("No",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.cancel();
                                // Write your code here for No
                            }
                        });
        alBuilder.setCancelable(false);
        alBuilder.show();

谢谢!但我觉得你误解了我的问题。 - Arci
我正在寻找类似于 activity.getActiveDialog(DIALOG_ID).getButton(...).performClick() 的东西。就像 activity.dismissDialog(DIALOG_ID) 一样,您可以仅使用 DIALOG_ID 关闭对话框。 - Arci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接