[Android] Dialog--onPrepareDialog()和onCreateDialog

Activities提供了一種方便管理的建立、保存、回覆的對話框機制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,若是使用這些方法的話,Activity將經過 getOwnerActivity()方法返回該Activity管理的對話框(dialog).android

  onCreateDialog(int):當你使用這個回調函數時,Android系統會有效的設置這個Activity爲每一個對話框的全部者,從而自動管理每一個對話框的狀態並掛靠到Activity上。這樣,每一個對話框繼承這個Activity的特定屬性。好比,當一個對話框打開時,菜單鍵顯示爲這個 Activity定義的選項菜單,音量鍵修改Activity使用的音頻流。app

  showDialog(int): 當你想要顯示一個對話框時,調用showDialog(int id) 方法並傳遞一個惟一標識這個對話框的整數。當對話框第一次被請求時,Android從你的Activity中調用onCreateDialog(int id),你應該在這裏初始化這個對話框Dialog。這個回調方法被傳以和showDialog(int id)相同的ID。當你建立這個對話框後,在Activity的最後返回這個對象。ide

  onPrepareDialog(int, Dialog):在對話框被顯示以前,Android還調用了可選的回調函數onPrepareDialog(int id, Dialog). 若是你想在每一次對話框被打開時改變它的任何屬性,你能夠定義這個方法。這個方法在每次打開對話框時被調用,而onCreateDialog(int) 僅在對話框第一次打開時被調用。若是你不定義onPrepareDialog(),那麼這個對話框將保持和上次打開時同樣。這個方法也被傳遞以對話框的 ID,和在onCreateDialog()中建立的對話框對象。函數

  dismissDialog(int):當你準備關閉對話框時,你能夠經過對這個對話框調用dismiss()來消除它。若是須要,你還能夠從這個Activity中調用 dismissDialog(int id) 方法,這實際上將爲你對這個對話框調用dismiss() 方法。 若是你想使用onCreateDialog(int id) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),而後每次你的對話框消除的時候,這個對話框對象的狀態將由該Activity保留。若是你決定再也不須要這個對象或者清除該狀態是重要的,那麼你應該調用removeDialog(int id)。這將刪除任何內部對象引用並且若是這個對話框正在顯示,它將被消除。this

  下面是幾種對話框的效果spa

----> showDialog()調用createDialog()和onPrepareDialog(),其中createDialog()調用onCreateDialog()。

項目源碼:

package com.bn.ex2s;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Sample2_19_Activity extends Activity
{
    final int PROGRESS_DIALOG = 0;
    final int INCREASE = 0;
    final int MAX_COUNTER = 100;
   
    ProgressDialog pd;
    Handler hd;
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Button bok = (Button) this.findViewById(R.id.Button01);
        bok.setOnClickListener
        (
            new OnClickListener()
            {
                @Override  
                public void onClick(View v)
                {
                    showDialog(PROGRESS_DIALOG);                   
                }
            }
        ); 
       
        hd = new Handler()
        {
            @Override
            public void handleMessage(Message msg)  //必須重寫此方法,用於接收數據
            {
                super.handleMessage(msg);               
                switch(msg.what)
                {
                   case INCREASE:
                     pd.incrementProgressBy(1);//進度每次加1
                        if(pd.getProgress() >= MAX_COUNTER)
                        {
                            pd.dismiss();                                
                        }                      
                   break;
                }
            }
        };
    }
   
    @Override
    public Dialog onCreateDialog(int id)
    {
        switch(id)
        {
              case  PROGRESS_DIALOG:
                 pd = new ProgressDialog(this);
                 pd.setMax(MAX_COUNTER);//設置最大值
                 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
                 pd.setTitle(R.string.title);//設置標題
                 pd.setCancelable(false);//設置進度對話框不能用回退按鈕關閉    
                 Log.d("kkk", "kkk");
              break;
        }       
        return pd;
    }  
   
    @Override
    //每次彈出對話框時被回調以動態更新對話框內容的方法
    public void onPrepareDialog(int id, Dialog dialog)
    {
        super.onPrepareDialog(id, dialog);
           switch(id)
           {
          case  PROGRESS_DIALOG:
            pd.incrementProgressBy(-pd.getProgress());//對話框進度清零
            new Thread()
            {
                  public void run()
                  {
                    while(true)
                    {
                          hd.sendEmptyMessage(INCREASE);
                          if(pd.getProgress() >= MAX_COUNTER)
                          {
                              break;
                          }
                          try
                          {
                              Thread.sleep(40);
                          }
                          catch(Exception e)
                          {
                              e.printStackTrace();
                          }
                     }
                  }                
             }.start();
          break;
        }
    }
}       

==================================================================================================

Android SDK 源代碼:

public final void showDialog(int id) {
        showDialog(id, null);
}

==================================================================================================

public final boolean showDialog(int id, Bundle args) {
        if (mManagedDialogs == null) {
            mManagedDialogs = new SparseArray<ManagedDialog>();
        }
        ManagedDialog md = mManagedDialogs.get(id);
        if (md == null) {
            md = new ManagedDialog();
            md.mDialog = createDialog(id, null, args);
            if (md.mDialog == null) {
                return false;
            }
            mManagedDialogs.put(id, md);
        }
       
        md.mArgs = args;
        onPrepareDialog(id, md.mDialog, args);
        md.mDialog.show();
        return true;
}

==================================================================================================

 private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
        final Dialog dialog = onCreateDialog(dialogId, args);
        if (dialog == null) {
            return null;
        }
        dialog.dispatchOnCreate(state);
        return dialog;
}orm

相關文章
相關標籤/搜索