2016-04-15 101 views
1

我想创建一个函数来创建一个AlertDialog并返回用户输入的字符串,这是我创建对话框的函数,该如何返回值?从AlertDialog返回一个值

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 
} 
+0

'return m_text'?你在确定处理程序中分配值...这不起作用吗? – Krease

+0

我想函数返回m_text – OmerN

+0

啊,'builder.show'不是一个阻塞函数。您需要阻止您的方法,直到值已准备就绪或使用回调机制。 – Krease

回答

3

在进入解决方案之前,我想解释一些您可能忽略的内容。

当你显示你的AlertDialog时,你的代码会一直运行,不会等待它完成(openDialog()调用继续执行而不等待AlertDialog返回任何东西),这就是为什么你有onClickListeners来处理你的回调(表达当用户点击对话框确定按钮或当他解除对话时你应该做什么)。

一个干净的方式来实现你想要的是创建一个功能接口(一个接口有一个方法),并用它来处理你的回调(使其返回你的字符串或其他)。

例:

interface OnOk{ 
    void hereIsYouText (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.hereIsYourText(input.getText().toString()); 
    } 
}); 
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.cancel(); 
     //TODO: you should handle this event as well! 
    } 
}); 
    builder.show(); 
} 

您可以使用它像这样:

openDialog("This is a title", 
      new OnOk(){ 
      @Override 
      hereIsYourText (String text){ 
       //I ll log it 
       Log.i("Texting",text); 
      }}); 

注意

我提供了这个答案,以演示如何在不完全改变代码的情况下以异步方式实现所要求的内容。

0

创建接受一个字符串值相同的类的另一种方法,则调用该函数提供的input.getText().toString()值从setPositiveButton onclick事件

+0

这听起来像一个回调模式 - 值得澄清,因此OP可以轻松查找其他示例。 – Krease

0

这看起来像你对我已经存储的值输入的文本在m_Text字段中。您既可以返回该字段,也可以在存储要返回的值的函数中包含一个变量。

如果您有:

//Return string 

简单地更换:

return m_Text; 

应该做的工作。

+0

没有,这将无法正常工作,它会返回一个空字符串,因为返回发生在用户单击确定之前。 – OmerN

+0

在这种情况下,你所要求的稍有不同。您将无法使用openDialog方法返回,因为正如您所说,它只是对话框的开始。 除非你在工作线程上运行它,并且可以睡眠直到发送返回值。 –

+0

@ExpiredData检查我的答案,以清楚了解发生了什么。 – AnixPasBesoin