如何从对话框按钮返回布尔值?

3
我有如下情况:
我有一个方法,用于对用户输入进行一些检查。
该方法返回true或false。
现在,如果符合条件,我的方法会弹出一些对话框。
由于onClick返回void,我无法从onClick中返回Boolean。
请问是否有任何解决办法?
谢谢!
public Boolean retrunvalue=false;
private Boolean performchecks() {

    if (!reminderdatepicked && !remindertimepicked) {

        AlertDialog.Builder builder = new AlertDialog.Builder(
                NewGenericEvent.this);
        builder.setTitle(R.string.remindernotsettitle);
        builder.setMessage(R.string.remindernotmessage)
        .setPositiveButton(R.string.yes,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                    int id) {
                retrunvalue= true;//NOT A GOOD IDEA
                                                      //BECAUSE IT RETURNS TRUE
                                                      //ONLY WHEN performchecks()
                                                      //IS CALLED THE SECOND TIME
            }
        });
        builder.setNegativeButton(R.string.no,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                    int id) {
                retrunvalue= false;
            }
        });

        builder.create().show();
        return retrunvalue;
    }


    return true;
}

@Maxim Shoustin 是的,但如果用户点击了肯定按钮,它应该立即返回true可能性,而不是在第二次调用performchecks()时才返回。 - Lisa Anne
1个回答

2
你尝试的是在主UI线程上阻塞,直到从OK点击获取响应。这不是一个好主意。
你可以在Google Groups中找到一些关于这个问题的讨论,但他们提出的解决方案对于你的目标来说过于复杂(由你选择)。
无论如何,我会创建一个处理程序来处理按钮点击,例如:
protected static final int DIALOG_CLICKED = 1;

private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        String txt;
        switch (msg.what) {
        case DIALOG_CLICKED:
            Boolean bool = Boolean.parseBoolean(msg.obj.toString());
            // When user press on "OK",
            // your braking point goes here
            break;
        default:
            super.handleMessage(msg);
        }
    }
};

修改 performchecks 后:
private void performchecks() {

        AlertDialog.Builder builder = new AlertDialog.Builder(
                this);
        builder.setTitle(R.string.remindernotsettitle);
        builder.setMessage(R.string.remindernotmessage)
        .setPositiveButton(R.string.yes,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                    int id) {

                mHandler.sendMessage(mHandler.obtainMessage(DIALOG_CLICKED, true)); 
            }
        });
        builder.setNegativeButton(R.string.no,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                    int id) {
                mHandler.sendMessage(mHandler.obtainMessage(DIALOG_CLICKED, false)); 
            }
        });

        builder.create().show();           
}

谢谢Maxim!我也在考虑这样的事情,关键是不需要在onClick内执行检查,检查是在之前进行的。如果点击了肯定按钮,我需要返回true,如果点击了否定按钮,则返回false... :-/ - Lisa Anne
这就是为什么我们使用AsyncTask在后台运行的原因。当用户按下“确定”时,我们运行asynctask并在执行检查后仅返回true。 - Maxim Shoustin
doInBackground返回true而不是对话框(据我所知) - Maxim Shoustin
始终返回 FALSE,因为该方法不会“等待”对话框上的操作。 - Lisa Anne

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