Android确认对话框返回true或false

ilo*_*mbo 12 android dialog confirmation

似乎没有简单的方法来获取Alert对话框来返回一个简单的值.
这段代码不起作用(答案变量不能在侦听器中设置,实际上它甚至不编译)

public static boolean Confirm(Context context) {
    boolean answer;
    AlertDialog dialog = new AlertDialog.Builder(context).create();
    dialog.setTitle("Confirmation");
    dialog.setMessage("Choose Yes or No");
    dialog.setCancelable(false);
    dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int buttonId) {
            answer = true;
        }
    });
    dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int buttonId) {
            answer = false;
        }
    });
    dialog.setIcon(android.R.drawable.ic_dialog_alert);
    dialog.show();
    return answer;
}
Run Code Online (Sandbox Code Playgroud)

注意:重要的是该方法是自包含的,即它不依赖于变量或外部的结构.只需打电话给你,得到你的答案,无论是真是假.

那么该怎么办?这个简单的返回的愿望假的似乎要复杂得多,值得.

此外,setButton方法具有以下形式:

dialog.setButton(int buttonId, String buttonText, Message msg)
Run Code Online (Sandbox Code Playgroud)

但目前尚不清楚如何使用它,发送到哪个meesage,使用哪个处理程序?

Ase*_*oro 17

我在这个论坛上发布了类似的问题,但最后我得到了答案.我在该帖子中的问题是如何创建可以通过其他类或活动访问的单独的确认对话框类,因此使用该确认对话框类我们不需要编写长编码.

这是我的答案.

首先,您必须创建DialogHandler.java

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import src.app.R;

public class DialogHandler {
    public Runnable ans_true = null;
    public Runnable ans_false = null;

    // Dialog. --------------------------------------------------------------

    public boolean Confirm(Activity act, String Title, String ConfirmText,
            String CancelBtn, String OkBtn, Runnable aProcedure, Runnable bProcedure) {
        ans_true = aProcedure;
        ans_false= bProcedure;
        AlertDialog dialog = new AlertDialog.Builder(act).create();
        dialog.setTitle(Title);
        dialog.setMessage(ConfirmText);
        dialog.setCancelable(false);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, OkBtn,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int buttonId) {
                         ans_true.run();
                    }
                });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, CancelBtn,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int buttonId) {
                        ans_false.run();
                    }
                });
        dialog.setIcon(android.R.drawable.ic_dialog_alert);
        dialog.show();
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在另一个类中调用它的示例

public class YourActivity extends Activity {
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(myclick);
    }

    public final Button.OnClickListener myclick = new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            doclick();
        }
    };

    public void doclick() {
        DialogHandler appdialog = new DialogHandler();
        appdialog.Confirm(this, "Message title", "Message content",
                "Cancel", "OK", aproc(), bproc());
    }

    public Runnable aproc(){
        return new Runnable() {
            public void run() {
                Log.d("Test", "This from A proc");
            }
          };
    }

    public Runnable bproc(){
        return new Runnable() {
            public void run() {
                Log.d("Test", "This from B proc");
            }
          };
    }


}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你的方法,它正在运行.我检查了一下. (2认同)

ilo*_*mbo 10

好吧,我会说我对自己非常满意,因为我找到了一个简单的答案,一个人靠我自己!
但事实是,虽然我找到了一种返回值的方法(我在下面展示).没用.

真正的问题是我想要一个同步Dialog,一个等待用户在之后恢复你的代码之前回答的对话框dialog.show().
Android中没有这样的野兽.所有对话框都是异步的,所以dialog.show()只在一些队列中发布对话框(我认为)并继续.因此,您无法及时得到答案.

对于它的所有价值(无),你会发现如何在构建对话框的方法中设置一个值.也许这种技术有其他用途,与对话框生命周期无关.




为了提供一些相关的信息,我会说,如果你更换

boolean answer;
Run Code Online (Sandbox Code Playgroud)

final boolean answer;
Run Code Online (Sandbox Code Playgroud)

可以从侦听器中访问变量,但是无法为其分配新值,因为它被声明为final.

这就是诀窍.
将变量定义为:

final boolean[] answer = new boolean[1];
Run Code Online (Sandbox Code Playgroud)

你们中的一些人已经知道为什么这会起作用.这里的最终变量不是布尔数组的单个元素,而是数组本身.
所以现在你可以根据需要分配数组元素[0].

dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int buttonId) {
        answer[0] = true;
    }
});
. . .
return answer[0];
Run Code Online (Sandbox Code Playgroud)

最后你可以从你的方法中返回它.


Lal*_*ani 5

您可以做的是为您的警报对话框创建一个侦听器,该侦听器使用接口侦听 AlertDialogs 操作。

创建一个接口。

public class MyInterface {

    DialogReturn dialogReturn;

    public interface DialogReturn {

        void onDialogCompleted(boolean answer);
    }

    public void setListener(DialogReturn dialogReturn) {
        this.dialogReturn = dialogReturn;
    }

    public DialogReturn getListener() {
        return dialogReturn;

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的类中只需实现您使用创建的接口 implements MyInterface.DialogReturn

然后你可以设置监听器并让它如下所示工作,

public class Main extends Activity implements MyInterface.DialogReturn{

    MyInterface myInterface;
    MyInterface.DialogReturn dialogReturn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                ....
        myInterface = new MyInterface();
        myInterface.setListener(this);
    }


   public void Confirm(Context context) {
        AlertDialog dialog = new AlertDialog.Builder(context).create();
        dialog.setTitle("Confirmation");
        dialog.setMessage("Choose Yes or No");
        dialog.setCancelable(false);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int buttonId) {
                myInterface.getListener().onDialogCompleted(true);
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int buttonId) {
                myInterface.getListener().onDialogCompleted(false);
            }
        });
        dialog.setIcon(android.R.drawable.ic_dialog_alert);
        dialog.show();
         }


@Override
    public void onDialogCompleted(boolean answer) {
        Toast.makeText(Main.this, answer+"", Toast.LENGTH_LONG).show();
            if(answer)
            // do something
            else
            // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ilomambo <unsolicitedEditorial>欢迎使用 Android!欢迎使用 Java。</unsolicitedEditorial> (2认同)