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>   
相關文章
相關標籤/搜索