从 AlertDialog 返回一个值

Returning A Value From AlertDialog

我想构建一个函数来创建 AlertDialog 和 return 用户输入的字符串,这是我用于创建对话框的函数,我如何 return 值?

String m_Text = "";
private String openDialog(String title) {
    AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
    builder.setTitle(title);

    final EditText input = new EditText(view.getContext());
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);
    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();
        }
    });
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    builder.show();

// return string
} 

在同一个 class 中创建另一个接受字符串值的方法,然后调用该函数提供 setPositiveButton onclick 事件

中的值 input.getText().toString()

在我看来,您已将输入文本的值存储在 m_Text 字段中。您可以只 return 那个字段,或者在函数中有一个变量,您可以在其中存储要 returned 的值。

你在哪里:

//Return string 

只需替换为:

return m_Text; 

应该完成这项工作。

打开您的 AlertDialog 的调用 builder.show() 不是阻塞调用,这意味着下一条指令将在不等待 AlertDialog 完成的情况下执行(return ).您应该与其交互的方式是使用某种回调。例如,您的 OnClickListeners 是这种模式的实现。

一个简单的回调模式

实现您想要的目标的一种简洁方法是创建一个功能接口,这是一个只有一个方法的接口。您将使用它来处理您的回调。

例子

interface OnOK{
    void onTextEntered(String text);
}

然后你会改变你的方法是这样的:

private void openDialog(String title, final OnOK onOK) {
    AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
    builder.setTitle(title);

    final EditText input = new EditText(view.getContext());
    input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);
    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {
          //Oi, look at this line!
          onOK.onTextEntered(input.getText().toString());
       }
    });

    builder.show();
} 

你可以这样使用它:

openDialog("Title", new OnOK() {
   @Override
   onTextEntered(String text) {
      Log.i("LOG", text);
   } 
});