創建對話框 Creating Dialogs
對話框通常是一個顯示在當前活動前面的小窗口。下面的活動失去焦點而由對話框接受所有的用戶交互。對話框通常被用來當做通知或者運行中的應用程序相關的短暫活動。
Android API 支持下面的對話框對象類型:
警告對話框 AlertDialog
這個對話框管理 0 , 1 , 2 ,或 3 個按鈕,和 / 或一個可包含復選框和單選按鈕的可選項列表。這個警告對話框能夠組建大多數用戶界面而且是推薦使用的對話框類型。請查看下面的創建一個警告對話框 Creating an AlertDialog 。
進度對話框 ProgressDialog
用來顯示一個進度輪或進度條。因此它是警告對話框的擴展,它也支持按鈕。請查看下面的 Creating a ProgressDialog 。
日期選擇對話框 DatePickerDialog
一個允許用戶選擇日期的對話框。請查看 Hello DatePicker 指南。
時間選擇對話框 TimePickerDialog
一個允許用戶選擇時間的對話框。請查看 Hello TimePicker 指南 .
如果你想定制你自己的對話框,你可以在基礎對話框對象或任何上面列舉的子類對話框上進行擴展并定義一個新的布局。請查看下面的創建自定義對話框 Creating a Custom Dialog 章節。
顯示對話框 Showing a Dialog
對話框經常作為活動 Activity 的一部分來創建和顯示。你通常應該從活動的 onCreateDialog(int) 回調方法里創建對話框。當你使用這個回調函數時, Android 系統會有效的設置這個活動為每個對話框的所有者,從而自動管理每個對話框的狀態并掛靠到活動上。這樣,每個對話框繼承這個活動的特定屬性。比如,當一個對話框打開時,菜單鍵顯示為這個活動定義的選項菜單,音量鍵修改活動使用的音頻流。
注意 : 如果你決定在 onCreateDialog() 方法之外創建一個對話框,它將不會被附著到活動上。不過,你可以通過 setOwnerActivity(Activity) 把它附著到一個活動上。
當你想要顯示一個對話框時,調用 showDialog(int) 方法并傳遞一個唯一標識這個對話框的整數。
當對話框第一次被請求時, Android 從你的活動中調用 onCreateDialog(int) ,你應該在這里初始化這個對話框 Dialog 。這個回調方法被傳以和 showDialog(int) 相同的 ID 。當你創建這個對話框后,在方法的最后返回這個對象。
在對話框被顯示之前, Android 還調用了可選的回調函數 onPrepareDialog(int, Dialog) . 如果你想在每一次對話框被打開時改變它的任何屬性,你可以定義這個方法。這個方法在每次打開對話框時被調用,而 onCreateDialog(int) 僅在對話框第一次打開時被調用。如果你不定義 onPrepareDialog() ,那么這個對話框將保持和上次打開時一樣。這個方法也被傳遞以對話框的 ID ,和在 onCreateDialog() 中創建的對話框對象。
定義 onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回調函數的最佳方法是使用一個 switch 語句來檢查傳遞進來的 id 參數。每個 case 應該檢查一個唯一的對話框 ID 然后創建和定義相應的對話框。比如,想象一下一個游戲使用兩個不同的對話框:一個用來指示這個游戲已經暫停而另一個來指示游戲結束。首先,為每個對話框定義一個整數:
static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;
然后,為每一個 ID 用一個 switch case 定義這個 onCreateDialog(int) 回調函數:
protected Dialog onCreateDialog(int id) {
Dialog dialog;
switch(id) {
case DIALOG_PAUSED_ID:
// do the work to define the pause Dialog
break;
case DIALOG_GAMEOVER_ID:
// do the work to define the game over Dialog
break;
default:
dialog = null;
}
return dialog;
}
注意 : 在這個例子里, case 語句沒有具體內容,因為這超出了本章討論范圍。
當是時候顯示其中之一的對話框時,使用對話框 ID 調用 showDialog(int) :
showDialog(DIALOG_PAUSED_ID);
消除對話框 Dismissing a Dialog
當你準備關閉對話框時,你可以通過對這個對話框調用 dismiss() 來消除它。如果需要,你還可以從這個活動中調用 dismissDialog(int) 方法,這實際上將為你對這個對話框調用 dismiss() 方法 .
如果你想使用 onCreateDialog(int) 方法來管理你對話框的狀態(就如同在前面的章節討論的那樣),然后每次你的對話框消除的時候,這個對話框對象的狀態將由該活動保留。如果你決定不再需要這個對象或者清除該狀態是重要的,那么你應該調用 removeDialog(int) 。這將刪除任何內部對象引用而且如果這個對話框正在顯示,它將被消除。
使用消除偵聽器 Using dismiss listeners
如果你希望你的應用程序在一個對話框消亡的時候執行一些流程,那么你應該附著一個 on-dismiss 偵聽器到對話框上。
首先定義 DialogInterface.OnDismissListener 接口。這個接口只有一個方法, onDismiss(DialogInterface) ,將在對話框消亡的時候被調用。然后簡單的傳遞你的 OnDismissListener 實現給 setOnDismissListener() 。
然而 , 請注意對話框也可以被 “ 取消 ” 。這是一個表明對話框被用戶顯示取消的特殊情況。這將在用戶按 “ 返回 ” 按鈕時發生,或者這個對話框顯示的調用 cancel() (也許通過對話框上的一個 “ 取消 ” 按鈕)。當一個對話框被取消時,這個 OnDismissListener 依然會被通知到,但是如果你希望在對話框被顯示取消時被通知到(而不是通常的消除方式),那么你應該通過 setOnCancelListener() 注冊一個 DialogInterface.OnCancelListener 。
創建警告對話框 Creating an AlertDialog
一個警告對話框是對話框的擴展類。它能夠構建大多數對話框用戶界面并且是推薦使用的對話框類型。你應該在具備如下特性的時候使用它:
· 一個標題
· 一個文本消息
· 1 個, 2 個或 3 個按鈕
· 一個可選項列表(可選的復選框或單選按鈕)
為了創建一個警告對話框,使用 AlertDialog.Builder 子類。通過 AlertDialog.Builder(Context) 獲取一個構造器然后使用這個類的公共方法來定義警告對話框的所有屬性。當得到構造器后,通過 create() . 方法來獲取警告對話框對象。
下面的題目說明了如何使用 AlertDialog.Builder 類來定義不同的警告對話框屬性。如果你在 onCreateDialog() 回調函數中使用下面的代碼,你可以返回結果對話框對象來顯示它。
增加按鈕 Adding buttons
為了創建一個如右圖所示的包含并行按鈕的警告對話框,使用 set...Button() 方法:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
首先,為這個對話框添加一個消息 setMessage(CharSequence) 。然后,開始函數鏈并設置該對話框為不能取消 not cancelable (因此用戶不能使用返回按鈕關閉這個對話框)。對每個按鈕,使用任一 set...Button() 方法,比如 setPositiveButton() ,該方法接受按鈕名稱以及一個定義用戶選中按鈕后所采取動作的 DialogInterface.OnClickListener 。
注意 : 你僅可以為這個警告對話框添加其中一種按鈕類型。也就是,你不能包含多個“確定”按鈕。這限制了可能的按鈕數目只能是 3 個:確定,中立和否定。這些名字和你按鈕的實際功能是技術上無關的,但是應該可以幫助你記錄做了什么。
增加一個列表 Adding a list
為了創建一個帶有可選項列表的警告對話框,如右邊所示,可使用 setItems() 方法:
final CharSequence[] items = {"Red", "Green", "Blue"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
首先,用 setTitle(CharSequence) 方法給對話框添加一個標題。然后,添加用 setItems() 添加一個可選項列表,該列表接受一組顯示的 items 和一個 DialogInterface.OnClickListener 來定義用戶選中按鈕后所采取動作。
增加復選框和單選按鈕
要在對話框里創建一個多選項列表( checkboxes )或者單選項( radio buttons ),可分別調用 setMultiChoiceItems() 和 setSingleChoiceItems() 方法。如果你在 onCreateDialog() 回調函數中創建這些可選列表, Android 會幫你管理列表狀態。只要這個活動是激活的,對話框會記住之前選中的 items ,但如果用戶退出這個活動,用戶選擇將丟失。
注意 : 為了在用戶離開或暫停這個活動的時候能夠保存選擇,你必須通過活動生命期 Activity Lifecycle 來恰當的保存和恢復設置。為了永久保存選項,即使活動進程被完全終止,你需要使用數據存儲 Data Storage 技術。
要創建如右邊所示的一個包含單選項列表的警告對話框,使用前面例子中相同的代碼,不過需要把 setItems() 方法替換為 setSingleChoiceItems() 。
final CharSequence[] items = {"Red", "Green", "Blue"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
setSingleChoiceItems() 的第二個參數是一個 checkedItem 整型數值,指示了基于 0 的缺省選擇項的位置。“ -1 ”代表不會有默認選擇項。
創建進度對話框 Creating a ProgressDialog
進度對話框 ProgressDialog 是 AlertDialog 類的一個擴展,可以為一個未定義進度的任務顯示一個旋轉輪形狀的進度動畫,或者為一個指定進度的任務顯示一個進度條。這個對話框也能提供按鈕,比如一個取消下載的按鈕。
可以簡單的通過調用 ProgressDialog.show() 方法來顯示一個進度對話框。比如, 可以很簡單的得到右邊顯示的進度對話框,而不必通過 onCreateDialog(int) 回調管理這個對話框,如下所示:
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
第一個參數是應用程序上下文 Context ,第二個是對話框標題(此處為空),第三個是信息,最后這個參數表明進度是否是不確定的(這只和創建進度條有關,下一章會有描述)。
進度對話框的缺省類型是一個旋轉輪,如果你想創建一個間隔進度,需要更多的代碼,如下章所述。
顯示進度條 Showing a progress bar
使用動畫進度條顯示進度:
1. 用類構造器初始化進度對話框, ProgressDialog(Context) 。
2. 用 setProgressStyle(int) 方法設置進度風格為 "STYLE_HORIZONTAL" 以及設置其它屬性,比如消息。
3. 當你準備顯示這個對話框時,調用 show() 或者從 onCreateDialog(int) 回調中返回 ProgressDialog 。
4. 你可以通過調用 setProgress(int) 設置當前進度百分比或者調用 incrementProgressBy(int) 方法增加進度值。
比如,你的設置可能看起來像這樣:
ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
設置很簡單。大多數創建代碼也用來更新進度。你可能意識到創建另外一個線程來完成這個進度報告的工作是有必要的,進度通過一個對象返回給活動的用戶界面線程。如果你對如何通過一個 Handler 使用另外的線程不熟悉,請參見下面的例子:
Example ProgressDialog with a second thread
這個例子使用了另外一個線程來跟蹤進程進度(計數到 100 )。這個線程在每次進度更新時通過一個句柄 Handler 發回一條消息 Message 。主活動然后更新進度對話框。
package com.example.progressdialog;
import android.app.Activity;
import android.app.Dialog; EN-US
發表評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論