一個對話框通常是一個出如今當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對話框接受全部的用戶交互. 對話框通常用於提示信息和與當前應用程序直接相關的小功能. android
Android API 支持下列類型的對話框對象: app
若是你但願自定義你的對話框, 能夠擴展Dialog類. 函數
一個對話框老是被建立和顯示爲一個Activity的一部分. 你應該在Activity的onCreateDialog(int)中建立對話框. 當你使用這個回調函數時,Android系統自動管理每一個對話框的狀態並將它們和Activity鏈接, 將Activity變爲對話框的"全部者". 這樣,每一個對話框從Activity繼承一些屬性. 例如,當一個對話框打開時, MENU鍵會顯示Activity的菜單, 音量鍵會調整Activity當前使用的音頻流的音量. 佈局
注意: 若是你但願在onCreateDialog()方法以外建立對話框, 它將不會依附在Activity上. 你可使用setOwnerActivity(Activity)來將它依附在Activity上. 動畫
當你但願顯示一個對話框時, 調用showDialog(int)並將對話框的id傳給它. ui
當一個對話框第一次被請求時,Android調用onCreateDialog(int). 這裏是你初始化對話框的地方. 這個回調函數傳入的id和showDialog(int)相同. 建立對話框以後,將返回被建立的對象. this
在對話框被顯示以前,Android還會調用onPrepareDialog(int, Dialog). 若是你但願每次顯示對話框時有動態更改的內容, 那麼就改寫這個函數. 該函數在每次一個對話框打開時都調用. 若是你不定義該函數,則對話框每次打開都是同樣的. 該函數也會傳入對話框的id以及你在onCreateDialog()中建立的Dialog對象. spa
最好的定義onCreateDialog(int) 和onPrepareDialog(int, Dialog) 的方法就是使用一個switch語句來檢查傳入的id. 每一個case建立相應的對話框. 例如, 一個遊戲使用兩個對話框: 一個來指示遊戲暫停,另外一個指示遊戲結束. 首先, 爲它們定義ID: .net
static final int DIALOG_PAUSED_ID = 0;
而後, 在onCreateDialog(int)中加入一個switch語句: 線程
protected Dialog onCreateDialog(int id) {
注意: 在這個例子中, case語句爲空由於定義Dialog的程序在後面會有介紹.
在須要顯示對話框是, 調用showDialog(int), 傳入對話框的id:
showDialog(DIALOG_PAUSED_ID);
當你準備關閉對話框時, 你可使用dismiss()函數. 若是須要的話, 你也能夠從Activity調用dismissDialog(int), 兩者效果是同樣的.
若是你使用onCreateDialog(int)來管理你的對話框的狀態, 那麼每次你的對話框被解除時, 該對話框對象的狀態會被Activity保存. 若是你決定你再也不須要這個對象或者須要清除對話框的狀態, 那麼你應該調用removeDialog(int). 這將把全部該對象的內部引用移除, 若是該對話框在顯示的話將被解除.
若是你但願在對話框解除時運行某些程序, 那麼你應該給對話框附加一個解除監聽器.
首先定義DialogInterface.OnDismissListener接口. 這個接口只有一個方法,onDismiss(DialogInterface), 該方法將在對話框解除時被調用.
而後將你的OnDismissListener實現傳給setOnDismissListener().
然而,注意對話框也能夠被"取消". 這是一個特殊的情形, 它意味着對話框被用戶顯式的取消掉. 這將在用戶按下"back"鍵時, 或者對話框顯式的調用cancel()(按下對話框的cancel按鈕)時發生. 當一個對話框被取消時, OnDismissListener將仍然被通知, 但若是你但願在對話框被顯示取消(而不是正常解除)時被通知, 則你應該使用setOnCancelListener()註冊一個DialogInterface.OnCancelListener.
An AlertDialog is an extension of the Dialog class. It is capable of constructing most dialog user interfaces and is the suggested dialog type. You should use it for dialogs that use any of the following features:
一個警告對話框是對話框的一個擴展. 它可以建立大多數對話框用戶界面而且是推薦的對話框類新星. 對於須要下列任何特性的對話框,你都應該使用它:
要建立一個AlertDialog, 使用AlertDialog.Builder子類. 使用AlertDialog.Builder(Context)來獲得一個Builder, 而後使用該類的公有方法來定義AlertDialog的屬性. 設定好之後, 使用create()方法來得到AlertDialog對象.
下面的主題展現瞭如何爲AlertDialog定義不一樣的屬性, 使用AlertDialog.Builder類. 若是你使用這些示例代碼, 你能夠在onCreateDialog()中返回最後的Dialog對象來得到圖片中對話框的效果.
要建立一個如圖所示的窗口, 使用set...Button()方法:
首先,使用setMessage(CharSequence)爲對話框增長一條消息。 而後, 開始連續調用方法, 使用setCancelable(boolean)將對話框設爲不可取消(不能使用back鍵來取消)。對每個按鈕,使用set...Button()方法,該方法接受按鈕名稱和一個DialogInterface.OnClickListener,該監聽器定義了當用戶選擇該按鈕時應作的動做。
注意:對每種按鈕類型,只能爲AlertDialog建立一個。也就是說,一個AlertDialog不能有兩個以上的"positive"按鈕。這使得可能的按鈕數量最多爲三個:確定、否認、中性。這些名字和實際功能沒有聯繫,可是將幫助你記憶它們各作什麼事情。
要建立一個具備可選項的AlertDialog,使用setItems()方法:
首先增長一個標題。而後使用setItems()增長一個可選列表,該列表接受一個選項名稱的列表和一個DialogInterface.OnClickListener, 後者定義了選項對應的響應。
要建立一個帶有多選列表或者單選列表的對話框, 使用setMultiChoiceItems()和setSingleChoiceItems()方法。若是你在onCreateDialog()中建立可選擇列表, Android會自動管理列表的狀態. 只要activity仍然活躍, 那麼對話框就會記住剛纔選中的選項,但當用戶退出activity時,該選擇丟失。
注意: 要在你的acitivity離開和暫停時保存選擇, 你必須在activity的聲明週期中正確的保存和恢復設置。爲了永久性保存選擇,你必須使用數據存儲技術中的一種。
要建立一個具備單選列表的AlertDialog,只需將一個例子中的setItems()換成 setSingleChoiceItems():
第二個參數是默認被選中的選項位置,使用「-1」來表示默認狀況下不選中任何選項。
一個ProgressDialog(進度對話框)是AlertDialog的擴展。它能夠顯示一個進度的動畫——進度環或者進度條。這個對話框也能夠提供按鈕,例如取消一個下載等。
打開一個進度對話框很簡單,只須要調用 ProgressDialog.show()便可。例如,上圖的對話框能夠不經過onCreateDialog(int),而直接顯示:
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",第一個參數是應用程序上下文。第二個爲對話框的標題(這裏爲空),第三個爲對話框內容, 最後一個爲該進度是否爲不可肯定的(這隻跟進度條的建立有關,見下一節)。
進度對話框的默認樣式爲一個旋轉的環。若是你但願顯示進度值,請看下一節。
使用一個動畫進度條來顯示進度:
例如,你的設置可能像這樣:
設置很簡單。大部分建立進度對話框須要的代碼是在更新它的進程中。你可能須要在一個新的線程中更新它,並使用Handler來將進度報告給Activity。若是你不熟悉使用Handler和另外的線程,請看下列例子,該例子使用了一個新的線程來更新進度。
這個例子使用一個線程來跟蹤一個進程的進度(其實爲從1數到100)。每當進度更新時,該線程經過Handler給主activity發送一個消息。主Activity更新ProgressDialog.
package com.example.progressdialog;
若是你想自定義一個對話框,你可使用佈局元素來創造你的對話框的佈局。定義好佈局後,將根View對象或者佈局資源ID傳給setContentView(View).
例如,建立如圖所示的對話框:
該xml定義了一個LinearLayout中的一個ImageView 和一個TextView。
在初始化Dialog以後,使用setContentView(int),將佈局資源id傳給它。如今Dialog有一個定義好的佈局,你可使用findViewById(int)來找到該元素的id並修改它的內容。
一個使用Dialog類創建的對話框必須有一個標題。若是你不調用setTitle(),那麼標題區域會保留空白。若是你不但願有一個標題,那麼你應該使用AlertDialog類來建立自定義對話框。然而,因爲一個AlertDialog使用AlertDialog.Builder類來創建最方便,因此你沒有方法使用setContentView(int),而是隻能使用setView(View)。該方法接受一個View對象,因此你須要從xml中展開你的根View。
要展開一個xml佈局,使用 getLayoutInflater() (或 getSystemService())取得LayoutInflater,而後調用inflate(int, ViewGroup),第一個參數爲佈局id,而第二個參數爲根view的id。如今,你可使用展開後的佈局來找到View對象並定義ImageView和TextView元素的內容。而後實例化AlertDialog.Builder並使用setView(View)來爲對話框設置展開後的佈局。
例如:
使用AlertDialog來自定義對話框,能夠利用其內置特性例如按鈕、選擇列表、標題、圖標等。