Dialog 的一些回撥處理

無聊小生發表於2011-04-16

1、AlertDialog,具有0-3個按鈕,可以放選項、核取方塊單選框等,以建議的方式域使用者互動可以。
2、ProgressDialog,顯示一個進度的圓環或者進度條。
3、DataPickerDialog,選擇日期的dialog。
4、TimePickerDialog,選擇時間的dialog。

使用者可以繼承Dialog類或者它的子類並且建立一個新的leyout。

Showing a Dialog

Dialog總是作為一個Activity的一部分來建立和顯示的。正常可以使用Activity的onCreateDialog(int)回撥函式來建立Dialog。使用這個回撥函式的時候,系統會自動管理每個dialog的狀態,並把它們關聯到這個Activity,有效的使它成為dialog的所有者。這樣每個第啊咯個都從父Activity繼承一些屬性。For example, when a dialog is open, the Menu key reveals the options menu defined for the Activity and the volume keys modify the audio stream used by the Activity.
注意:如果你在onCreate()之外建立dialog,他不會附屬於任何的Activity,可以使用dialog的setOwnerActivity(Activity)來設定。
當想顯示一個dialog的時候,呼叫showDialog(int),並傳遞一個整數來唯一標識想要顯示的dialog即可。
當第一次使用一個dialog的時候,Android會呼叫onCreateDialog(int),應該在這裡建立dialog。這個回撥方法的引數是你傳遞給showDialog(int)的id。建立Dialog結束後,返回這個dialog物件。
在現實一個dialog之前,Android會先用可選的回撥非法onPrepareDialog(int)。如果想在每次開啟dialog的時候改變它的屬性就可以通過重寫這個方法來實現。他會在每次開啟dialog的時候被呼叫,而onCreateDialog(int)只在第一次開啟一個dialog的時候呼叫。如果不定義onPrepareDialog(),那麼dialog將保持塌方上次被開啟的屬性。This method is also passed the dialog's ID, along with the Dialog object you created in onCreateDialog()。

建立Dialog的Example:

 

顯示建立的dialog:showDialog(DIALOG_PAUSED_ID);

Dismissing a Dialog

當準備關閉dialog的時候,可以呼叫dialogobject的dismiss()方法。如果必要,可以呼叫Activity的dismissDialog(int),它會有效的呼叫dialog的dismiss()。
如果你使用onCreateDialog(int)來管理dialog的狀態,那麼每次關閉dialog的時候,dialog的狀態都會被Activity儲存。如果這個dialog不會再次被使用或者清除它的狀態很重要,可以呼叫removeDialog(int),這回清除內部任何對它的引用,如果它正在顯示,會被關閉。

Using dismiss listeners

如果想在dialog被關閉的時候執行一些操作,應該為dialog設定on-dismiss listener。

首先定義DialogInterfacev.OnDismissListener介面。這個介面只有一個方法,vonDismiss(DialogInterface),當關閉dialog的時候會呼叫這個方法。把OnDismissListener的實現傳遞給setOnDismissListener()就可以了。
注意,dialog可以被取消。這是由使用者顯示取消dialog的特殊情況,在使用者點選back鍵或者顯示呼叫cancel()函式就是這種情況。當dialog被cancel的時候,OnDismissListener不會被通知,如果你想知道dialog被顯示的cancel(不是正常的關閉),那麼你應該用setOnCancel()註冊一個vDialogInterface.OnCancelListener。

Creating an AlertDialog
AlertDialog是Dialog的子類,它可以構造使用者互動的多數dialog,是建議的dialog型別。下列情況可以使用AldertDialog:
A tittle;
A text message;
One,two,or three buttons;
A list of selectable items (with optional checkboxes or radio buttons)

可以使用AlertDialog.Builder的子類來建立AlertDialog。通過AlertDialogBuilder(Context)來建立一個builder並使用這個builder的public方法來定義AlertDialog的所有屬性。在使用builder建立結束後,使用create()來得到建立的AlertDialog物件。

The following topics show how to define various properties of the AlertDialog using the AlertDialog.Builder class. If you use any of the following sample code inside your onCreateDialog() callback method, you can return the resulting Dialog object to display the dialog.

Adding buttons

 

注意:每種型別的按鈕只能新增一個。這限制了按鈕的個數(3個)。這些名字於其功能無關只用來幫助你記住這些按鈕是幹嘛的。

 

可以用vsetMultiChoiceitems()和setSingleChoiceItems()來在AlertDialog上設定多選或者單選列表。如果使用onCreateDialog()建立這些選項列表,那麼Android會維護這個選項列表的狀態。在Activity存活期間,這個dialog會記住先前的選項狀態,但是當使用者利卡這個Activity時,選項狀態就會丟失。
注意:為了在使用者退出或者暫停這個Activity時儲存選項狀態,你必須在整個Activity的生命週期中恰當的儲存和恢復選項狀態。為了永久的儲存選項狀態(甚至在Activity程式完全結束之後),你應該使用資料儲存技術來儲存選項狀態。

To create an AlertDialog with a list of single-choice items like the one shown to the right, use the same code from the previous example, but replace the setItems() method with setSingleChoiceItems():

 

在setSingleChoiceItems()的第二個引數是一個整形表示哪個item被選中,item的標識從0開始,-1表示沒有item預設被選中。

Creating a ProgressDialog
ProgressDialog是AlertDialog的子類,可以顯示進度動畫:用旋轉的環表示進度未定義的task;用進度條表示定義了進度的task。這個dialog也可以提供按鈕,比如下載過程中的取消按鈕。
開啟一個進度dialog簡單到只要呼叫ProgressDialog.show()就可以了。
比如:
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
"Loading. Please wait...", true);
第一個引數是程式的context, 第二個引數是tittle,第三個是message, 第三個參數列示這個progress時候是不清楚的(它只在建立進度條的時候有意義, which is discussed in the next section).

Showing a progress bar
顯示一個用動畫表示進度的進度條:
1、用構造方法ProgressDialog(Context)初始一個ProgressDialog。
2、用setProgressStyle(int)設定style為STYLE_HORIZONTAL,並設定其他的屬性,比如message等。
3、準備顯示dialog的時候呼叫show()或者使用onCreateDialog(int)來返回這個ProgressDialog。
4、可以呼叫setProgress(int)傳遞目前完成的全部百分比或者vincrementProgressBy(int)傳遞增量值來增加進度條顯示的進度。

比如:

 

設定ProgressDialog很簡單,建立ProgressDialog的多數程式碼多數是用來更新它的。你會發現需要使用Handler來建立新的執行緒來進行這項工作並把進度反映到Activity的UI上。

Example ProgressDialog with a second thread
This example uses a second thread to track the progress of a process (which actually just counts up to 100). The thread sends a Message back to the main Activity through a Handler each time progress is made. The main Activity then updates the ProgressDialog.

 

Creating a Custom Dialog

如果需要一個自定義設計的dialog,你可以建立自己的layout。定義好layout後,傳遞root View物件或者leyout資源ID給setContentView(View)。
例如:
1、建立XML layout:

 

2、設定這個layout為這個dialog的內容    並定義ImageView和TextView的內容。 

在初始化dialog後,使用setContentView(int)設定自定義的layout為dialog的content view。這時這個dialog已經定義好了layout,你可以使用dialog的findViewByID(int)來從layout中得到View物件,並修改其中的內容。
3、好了,現在你可以顯示這個dialog了。

通過基類Dialog建立的dialog的必須有tittle,如果不呼叫setTittle(),那麼tittle的空間會空著而且可見。如果你根本不需要tittle,那麼應該使用AlertDialog來建立自定義的dialog。因為使用AlertDialog.Builder來建立AlertDialog更容易,你也不需要訪問vsetContentView(int)而是用setView(View)。它接受一個View物件引數,所以你需要inflate the layout's root View object from XML。
To inflate the XML layout,使用getLayoutInflater()或者getSystemService()得到LayoutInflater,然後呼叫inflate(int, ViewGroup)(第一個引數是layout的資源ID,第二個是root view的識別符號)。至此,你可以用這個inflated layout來得到layout中的View物件並且定義其中的內容了。然後初始AlertDialog.Builder並setView為這個inflated layout。
例如:

 

相關文章