分享

关于Android 自定义Dialog按钮监听和数据传递到Acitivity的实现

 muyable 2013-12-11

  (1)Android自定义对话框是一种非常实用的控件。与AlertDialog不同的是,自定义Dialog没有ALertDialog的builder,因此在Button按钮监听这一块需要自己定义,这也使自定义Dialog变得比较复杂。常用的是在Dialog中

  (2)Android自定义Dialog运行时往往需要与调用它的Activity进行数据传递,比如Dialog中的EditText输入的数据需要回调到Activity中使用,这个功能在C#中式非常常见的。但Android与C#所不一样的是。当Dialog运行时,Android是非阻塞的,也就是其下的.show()之下的代码还是会继续运行,而C#则是阻塞的。因此很多习惯C#的朋友在遇到Android的Dialog运行时,也是希望在show()之后直接获取Dialog中的数据。这事实上是行不通的。一种比较可行的方法是在自定义Dialog类时声明数据回调的接口,然后在Activity中实现接口的方法。

以下是一个简单的例子,用于解决这两个问题:

  1. public class InputDialog extends Dialog  
  2. {       private Context context;  
  3.     private EditText editText;  
  4.     private Button button_sure;  
  5.     private Button button_cancel;  
  6.     public OnSureClickListener mListener;  
  7.       
  8.     public InputDialog(Context context)  
  9.     {  
  10.         super(context);  
  11.         this.context = context; }  
  12.     public InputDialog(Context context,OnSureClickListener listener)   
  1. //对InputDialog的构造函数进行重载,添加了OnSureClickListener这个参数  
  1. {  
  2.     super(context);  
  3.     mListener = listener;  
  4. }  
  5. protected void onCreate(Bundle savedInstanceState)  
  6. {  
  7.     super.onCreate(savedInstanceState);  
  8.     this.setContentView(R.layout.project_edit_dialog);  
  9.     setView();  
  10. }  
  11. private  void setView()  
  12. {  
  13.     button_sure = (Button) findViewById(R.id.button_project_dialog_sure);  
  14.     button_cancel = (Button) findViewById(R.id.button_project_dialog_cancel);  
  15.     editText = (EditText) findViewById(R.id.edit_project_new_name);  
  1. //这里的监听事件,因为该类继承lDialog类的DialogInterface,而DialogInterface中也有OnClickListener,因此需要用到全名View.OnClickListener  
  2.         button_sure.setOnClickListener(new View.OnClickListener()   
  3.         {  
  4.             public void onClick(View v)  
  5.             {  
  6.                 mListener.getText(editText.getText().toString());  
  7.                 dismiss();  
  8.             }  
  9.         });  
  10.         button_cancel.setOnClickListener(new View.OnClickListener()  
  11.         {  
  12.             public void onClick(View v)  
  13.             {  
  14.                 mListener.getText(editText.getText().toString());//在Button监听事件中实现这一方法  
  15.                 dismiss();  
  16.             }  
  17.         });  
  18.     }  
  19.       
  20.     public interface OnSureClickListener  
  21.     {  
  22.         void getText(String string); //声明获取EditText中数据的接口  
  23.     }  
  24. }<pre class="java" name="code"> </pre><br>  
  25. <pre></pre>  
  26. <p>以上代码完成了自定义Dialog类的构建。接下来,如果想要在Activity中获取Dialog中的数据,只需实例化Dialog即可。</p>  
  27. <pre class="java" name="code">OnClickListener click_new = new OnClickListener()  
  28.     {  
  29.         public void onClick(View v)  
  30.         {  
  31.             OnSureClickListener listener1 = new OnSureClickListener(){  
  32.                 public void getText(String string)  
  33.                 {  
  34.                     inputFile = string;  
  35.                         try  
  36.                         {  
  37.                             addFile();  
  38.                         } catch (IOException e){}  
  39.                 }     
  40.             };  
  41.             InputDialog d1 = new InputDialog(ProjectActivity.this,listener1);  
  42.             d1.show();  
  43.         }  
  44.           
  45.     };</pre>  
  46. <p>在一个普通的Button OnClickListener中,实例化一个OnSureClickListener,Dialog中的EditText值便赋予给了Activity的成员变量inputFile。</p>  
  47. <p>  一</p>  
  48. <p> </p>  
  49. <pre></pre>  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多