Dialog中更新Activity的数据显示

假设有一个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();
    }

二、为自定义Dialog增长带监听器参数的构造函数:android

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;
    }

三、在Dialog中须要的地方去调用回调函数,好比在ListView的选择事件触发时:ide

dlg_priority_lvw.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

四、而后你在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();
            
            }
        });

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

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

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

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