Dialog學習筆記

Dialog概要

【簡介】Dialog是出現在當前Activity前方的一個小窗口,會獲得用戶的焦點。通常用於需要打斷用戶的通知,執行與應用程序進展直接相關的短暫任務。
【創建】一個Dialog可以被看成一個Activity的一部分,通常在Activity的onCreateDialog(int)中創建。在此方法中創建的Dialog會自動屬於此Acitivity,並繼承其一部分屬性,比如在激活Dialog的時候Menu鍵會打開爲這個Activity定義的optionsMenu。如果在此方法外面創建DIalog,那麼它對Activity是不可見的,可用setOwnerActivity(Activity)進行附着。
【顯示】有兩種方法來顯示。第一種從Activity的角度,調用showDialog(int),根據傳進去的int對相應Dialog進行創建或者更新,然後顯示。如果希望每次打開Dialog之前都修改他的屬性,那麼需要override回調函數onPrepareDialog(int, Dialog)。第二種是從Dialog本身的角度,調用show()。
【解散】解散一個Dialog同樣可以從兩個角度出發。從Activity,可以調用dismissDialog(int),對於在onCreateDialog()中創建的Dialog,Activity會保存其狀態,如果不希望保存,可調用removeDialog(int)方法,他會清除Dialog的內在關聯。其次,從Dialog考慮,可以調用dismiss()或者cancel(),區別在於dismiss()內會用到onDismissListener(),cancel()內會調用dismiss(),還會調用onCancelListener(),物理按鍵back調用的是cancel()。

練習三種Dialog
Dialog類是創建Dialog的基礎類,但通常不會直接實例化它,而是使用它的子類,常用的AlertDialog,ProgressDialog,DatePickerDialog,TimePickerDialog,也可以訂製自己的Dialog。我寫了一個小程序,練習了AlertDialog,ProgressDialog和自定義Dialog。
【主菜單】點擊開始按鈕後,彈出主菜單,主菜單有三個選項,Alert,Progress和Custom。主菜單本身是用AlertDialog實現,下方沒有Button,上方有title和退出按鈕,也可通過物理按鍵back退出,content的部分用setItems()展示一個列表,每個選項選中後彈出相應的Dialog。
【Alert】對AlertDialog的練習是一個簡易的加法計算器,用setMultiChoiceItems()展示三個CheckBox,選中以後,點擊下方的Button,將選中的值的和Toast出來。沒有調用removeDialog()因此再次進入的時候,會保存上次選中的值。【注意】在AlertDialog中,List和Message不能同時顯示,如需此效果,可以使用自定義的Dialog。
【Progress】ProgressDialog用於顯示進度,具體有兩種,一種以一個滾動的輪子的形式,一種以進度條的形式。首先,用一個AlertDialog顯示有這兩種選項,用setSingleItems()以RadioButton的形式展示,下方有兩個按鈕,分別表示確定和取消。進入第一個按鈕【wheel】,直接用ProgressDialog.show(Context,CharSequence,CharSequence,boolean)返回一個ProgressDialog,設置其可退出及退出監聽器,就可以展示一個進度輪了。進入第二個按鈕【bar】,首先new一個ProgressDialog,然後setProgressStyle()設置爲ProgressDialog.STYLE_HORIZONTAL,這樣就會以進度條的形式出現而不是進度輪,然後設置其可退出,調用show(),再setProgress()。【注意】此處在show()之前setProgress()是無效的,必須先show()再setProgress()。
【Custom】使用了兩種方法來實現自定義Dialog。【第一種】是通過Dialog來做,這種情況下,標題欄一定會存在,如果標題爲空,標題欄所佔的空間依然會存在。首先創建一個Dialog,然後getLayoutInflater()獲取縮放器inflater,調用inflater.inflate(int ResId,ViewGroup root)對我們自定義的佈局文件進行縮放並返回,被縮放後的佈局文件就可以被setContentView()了,設置好佈局文件後就能findViewById來獲取控件並進行設置了,最後調用dialog的show()進行展示。【第二種】是通過AlertDialog來做,這樣如果標題爲空,那麼它不會繼續佔用空間。首先創建AlertDialog.Builder,然後同樣獲得inflater對佈局文件進行縮放,與上面不同的是,這裏不再調用dialog的setContentView(),而是調用builder的setView()方法,之後同樣地獲取和設置控件,最後調用builder的()和alertDialog繼承的show()顯示出來,當然也可以採用其他的顯示方法。【注意】按Dev Guide中那樣,直接把自己的佈局文件設置爲Dialog的佈局,是無法獲取其中的控件的,必須先用Inflater進行縮放在設置爲佈局。

AlertDialog詳解

【結構】AlertDialog繼承Dialog,實現了DialogInterface接口,組合了一個AlertController成員對象,包含一個靜態內部類Builder。
【創建步驟】
	【構造器】首先創建一個AlertDialog.Builder類的實例builder,在builder的構造方法中會創建AlertController的靜態內部類AlertParams的實例P。
	【設置】然後調用builder的一些列set()方法設置想要的特性,這些set()方法中將會把這些特性設置到P中。注意Builder的set()方法都可以進行鏈式編程。
	【創建】再調用builder的create()方法,在這個方法中將會構建一個AlertDialog的實例dialog,而dialog的構造方法中又會創建一個AlertController實例mAlert,然後通過P的apply()方法,把先前設置到P中的特性都設置到mAlert中。由於showCancel只是設置了Title欄的cancel,所以接下來再通過setCancelable()和setOnCancelListener()設置一下物理按鍵的cancel。
	【展示】調用builder的show()方法,在這個方法中,先調用create,再調用dialog繼承自Dialog的show()方法。
在繼承自Dialog的show()方法裏,先調用同樣是繼承的dispatchOnCreate,在裏面調用了自己複寫的onCreate方法。
在onCreate方法裏,調用了mAlert.installContent,其中,先設置好佈局文件,然後setupView,包括setupContent,setupButtons,setupTitle,setBackground,註冊佈局裏的控件及其屬性。【注意】show()方法會重新創建AlertDIalog和AlertController對象,原來會被捨棄。
	【其他展示方法】除了調用Builder的show()方法之外,還可以調用AlertDialog繼承自Dialog的show()方法,還可以調用Activity的showDialog()方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章