2010-12-09 61 views
3

我认为这很容易,但它让我难以置信。我有一个活动,显示一个自定义对话框,允许用户输入一些文本,然后确定并取消按钮定义。我使用show()显示它。但我无法弄清楚如何从对话框中取回数值。Android - 活动如何获得用户从对话框中输入的文本

我正在使用自定义对话框,因为它对文本条目进行了一些验证。我想我可以改变它从Activity派生,然后使用startActivityForResult显示它,但 - 至少基于我的旧windows编程时间 - 我认为让用户从Android对话框输入值很容易。

我可以忽略某种类型的回调或侦听机制吗? (1)除非它的修饰符被设置为final,然后(2)如果我说好的使它最终,不会让我分配它因为“最终局部变量值不能被分配,因为它是在一个封闭的类型定义的”

String value; 

    final EditText input = (EditText)findViewById(R.id.theText); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setView(input); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() 
    { 
     public void onClick(DialogInterface dialog, int whichButton) 
     { 
      value = input.getText().toString(); 
      dialog.dismiss(); 
     } 
    }); 
    builder.show(); 

[EDIT更新的溶液] =============== =============

我最终做的主要事情是增加了将Handler传递给对话框的能力。在对话框类我说:

private Handler clientHandler = null; 

    public void AddHandler(Handler client) 
    { 
     this.clientHandler = client; 
    } 

并更新对话框的确定​​按钮点击:在活动的onCreate()显示的对话框

/** 
    * The user pressed the OK button 
    * @param v 
    */ 
    public void okClick(View v) 
    { 
     // save the entered string 
     this.tag = this.tagEditText.getText().toString(); 

     if (null != this.clientHandler) 
     { 
     // Notify the client to update itself 
     this.clientHandler.sendMessage(clientHandler.obtainMessage()); 
     } 

     cancel(); 
    } 

然后我说:

tagDialog = new tagDialog(this); 

tagHandler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     tag = tagDialog.tag;    
    } 
}; 

tagDialog.AddHandler(tagHandler); 

回答

1

这听起来像你想发送消息给处理程序。使用obtainMessage()获取消息对象,然后通过消息队列将消息发送给处理程序。

+0

这些都是很好的建议,但这是一个让我沿着正确的道路解决我的问题的建议。我想事实证明,从我们希望的对话中获取数据并不那么容易。我将从我的最终解决方案发布代码。谢谢大家 – bursk 2010-12-09 23:00:19

2

将您想要保存的东西保存在DialogonClickListener中。使用dialog.findViewById()找到您的文本框,将文本保存到某处(或使用Handler),然后在Activity中检索保存的文本。

2

除非我在这里错过了一些东西,不会有静态字符串吗?

+0

是的,它为我的情况。但变量必须在课堂顶部宣布。反正有一个局部变量可以用于分配? – 2012-06-23 17:00:25