假设有一个activity,activity中有一个Button和一个TextView,点击按钮,弹出Dialog,对话框中有一个ListView,选中ListView中的某一项,关闭对话框,更新activity中EditText的值为你选中项的值。
分析这个问题,假设Dialog为AlertDialog,你可以直接在Button的OnClickListener事件中创建Dialog,并在AlertDialog的setPositiveButton或其他按钮监听器中完成对EditText值的更新;如果Dialog为自定义Dialog,你也完全可以将这个自定义Dialog以Activity内部类的方式实现,这样在Dialog中ListView的选择事件监听器中你仍然可以访问到EditText。
但是我不喜欢以这样的方式来实现,不管是代码复杂度的原因还是耦合的原因,总之我还是喜欢将自定义Dialog使用单独的类来创建。这样的话,在Dialog中你就访问不到Activity的EditText了,除非你将EditText的设为public(这当然不是一个好方法)。 网上查了下,发现可以通过回调函数来实现,仍然使用上一篇文章当中用到的自定义对话框作为例子,具体步骤如下:
1.新建一个接口作为Dialog的监听器,并在接口中声明回调函数:
   /**
* 自定义Dialog监听器
* @author Kael.Chen
*
*/
public interface PriorityListener {
/**
* 回调函数,用于在Dialog的监听事件触发后刷新Activity的UI显示
*/
public void refreshPriorityUI();
}

2、为自定义Dialog增加带监听器参数的构造函数:

private PriorityListener listener;

    public PriorityDlg(Context context) {
super(context);
this.context = context;
// TODO Auto-generated constructor stub
} public PriorityDlg(Context context, int theme) {
super(context, theme);
this.context = context;
} public PriorityDlg(Context context, int theme, PriorityListener listener) {
this(context, theme);
this.listener = listener;
}

3、在Dialog中需要的地方去调用回调函数,比如在ListView的选择事件触发时:

dlg_priority_lvw.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                    @Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
dismiss();
listener.refreshPriorityUI();
}
});

4、然后你在Activity中使用带监听器参数的构造函数去实例化自定义Dialog,并实现监听器中声明的回调函数就可以了:

 //为优先级选择按钮增加监听器
task_simple_form_priority.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
//弹出任务优先级选择对话框
PriorityDlg dlg = new PriorityDlg(SimpleTaskActivity.this, R.style.dlg_priority, new PriorityDlg.PriorityListener() { @Override
public void refreshPriorityUI() {
  //这里就是用来刷新Activity的UI显示的,如果你需要用到从Dialog传回的数据,你可以把该数据存储在全局变量中或者作为回调函数的参数传递进来
            Toast.makeText(SimpleTaskActivity.this, "完成选择", Toast.LENGTH_SHORT).show();
}
});
dlg.show(); }
});

解析(创建自定义对话框):

PriorityDlg dlg = new PriorityDlg(SimpleTaskActivity.this, R.style.dlg_priority);
return dlg;

R.style.dlg_priority设置了对话框使用的样式文件,只是让对话框去掉标题栏,当然你也可以通过代码来完成这种效果:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 对话框样式 -->
<style name="dlg_priority" parent="@android:Theme.Dialog">
  <item name="android:windowNoTitle">true</item>
</style>
</resources>
  

最新文章

  1. centos yum Segmentation fault 问题解决办法
  2. md5 (c语言)
  3. Android之数据库的创建
  4. ajax实现手机获取验证码
  5. crawler: 常用的一些工具
  6. Word Search [LeetCode]
  7. bootStrap-2
  8. Win+R指令(2)
  9. bzoj 3242: [Noi2013]快餐店 章鱼图
  10. jQuery幻灯插件:Nivo Slider
  11. SQL Server 两种判断表名是否存在且删除的方式
  12. Bag of Words(BOW)模型
  13. java与32/64位虚拟机
  14. CSDN文章抓取
  15. Exception in thread &quot;main&quot; SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected end of settings but encountered additional conte
  16. 42_redux_counter应用_redux异步版本
  17. KafKa记录
  18. Java 线性表、栈、队列和优先队列
  19. MachineLearning:
  20. Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04(转)

热门文章

  1. [BZOJ2758] [SCOI2012]Blinker的噩梦 扫描线+set
  2. js集合set类的实现
  3. 拦截并记录数据库操作-Logging and Intercepting Database Operations
  4. java序列化测试
  5. paxos协议更新日志
  6. Nginx设置静态页面压缩和缓存过期时间的方法
  7. HTML&amp;&amp;css面试题
  8. CentOS探索之路2---使用rpm安装JDK
  9. 任务四十:UI组件之日历组件(一)
  10. UIKit&#160;框架之UICollectionView