創(chuàng)建對(duì)話框 Creating Dialogs
對(duì)話框通常是一個(gè)顯示在當(dāng)前活動(dòng)前面的小窗口。下面的活動(dòng)失去焦點(diǎn)而由對(duì)話框接受所有的用戶(hù)交互。對(duì)話框通常被用來(lái)當(dāng)做通知或者運(yùn)行中的應(yīng)用程序相關(guān)的短暫活動(dòng)。
Android API 支持下面的對(duì)話框?qū)ο箢?lèi)型:
警告對(duì)話框 AlertDialog
這個(gè)對(duì)話框管理 0 , 1 , 2 ,或 3 個(gè)按鈕,和 / 或一個(gè)可包含復(fù)選框和單選按鈕的可選項(xiàng)列表。這個(gè)警告對(duì)話框能夠組建大多數(shù)用戶(hù)界面而且是推薦使用的對(duì)話框類(lèi)型。請(qǐng)查看下面的創(chuàng)建一個(gè)警告對(duì)話框 Creating an AlertDialog 。
進(jìn)度對(duì)話框 ProgressDialog
用來(lái)顯示一個(gè)進(jìn)度輪或進(jìn)度條。因此它是警告對(duì)話框的擴(kuò)展,它也支持按鈕。請(qǐng)查看下面的 Creating a ProgressDialog 。
日期選擇對(duì)話框 DatePickerDialog
一個(gè)允許用戶(hù)選擇日期的對(duì)話框。請(qǐng)查看 Hello DatePicker 指南。
時(shí)間選擇對(duì)話框 TimePickerDialog
一個(gè)允許用戶(hù)選擇時(shí)間的對(duì)話框。請(qǐng)查看 Hello TimePicker 指南 .
如果你想定制你自己的對(duì)話框,你可以在基礎(chǔ)對(duì)話框?qū)ο蠡蛉魏紊厦媪信e的子類(lèi)對(duì)話框上進(jìn)行擴(kuò)展并定義一個(gè)新的布局。請(qǐng)查看下面的創(chuàng)建自定義對(duì)話框 Creating a Custom Dialog 章節(jié)。
顯示對(duì)話框 Showing a Dialog
對(duì)話框經(jīng)常作為活動(dòng) Activity 的一部分來(lái)創(chuàng)建和顯示。你通常應(yīng)該從活動(dòng)的 onCreateDialog(int) 回調(diào)方法里創(chuàng)建對(duì)話框。當(dāng)你使用這個(gè)回調(diào)函數(shù)時(shí), Android 系統(tǒng)會(huì)有效的設(shè)置這個(gè)活動(dòng)為每個(gè)對(duì)話框的所有者,從而自動(dòng)管理每個(gè)對(duì)話框的狀態(tài)并掛靠到活動(dòng)上。這樣,每個(gè)對(duì)話框繼承這個(gè)活動(dòng)的特定屬性。比如,當(dāng)一個(gè)對(duì)話框打開(kāi)時(shí),菜單鍵顯示為這個(gè)活動(dòng)定義的選項(xiàng)菜單,音量鍵修改活動(dòng)使用的音頻流。
注意 : 如果你決定在 onCreateDialog() 方法之外創(chuàng)建一個(gè)對(duì)話框,它將不會(huì)被附著到活動(dòng)上。不過(guò),你可以通過(guò) setOwnerActivity(Activity) 把它附著到一個(gè)活動(dòng)上。
當(dāng)你想要顯示一個(gè)對(duì)話框時(shí),調(diào)用 showDialog(int) 方法并傳遞一個(gè)唯一標(biāo)識(shí)這個(gè)對(duì)話框的整數(shù)。
當(dāng)對(duì)話框第一次被請(qǐng)求時(shí), Android 從你的活動(dòng)中調(diào)用 onCreateDialog(int) ,你應(yīng)該在這里初始化這個(gè)對(duì)話框 Dialog 。這個(gè)回調(diào)方法被傳以和 showDialog(int) 相同的 ID 。當(dāng)你創(chuàng)建這個(gè)對(duì)話框后,在方法的最后返回這個(gè)對(duì)象。
在對(duì)話框被顯示之前, Android 還調(diào)用了可選的回調(diào)函數(shù) onPrepareDialog(int, Dialog) . 如果你想在每一次對(duì)話框被打開(kāi)時(shí)改變它的任何屬性,你可以定義這個(gè)方法。這個(gè)方法在每次打開(kāi)對(duì)話框時(shí)被調(diào)用,而 onCreateDialog(int) 僅在對(duì)話框第一次打開(kāi)時(shí)被調(diào)用。如果你不定義 onPrepareDialog() ,那么這個(gè)對(duì)話框?qū)⒈3趾蜕洗未蜷_(kāi)時(shí)一樣。這個(gè)方法也被傳遞以對(duì)話框的 ID ,和在 onCreateDialog() 中創(chuàng)建的對(duì)話框?qū)ο蟆?
定義 onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回調(diào)函數(shù)的最佳方法是使用一個(gè) switch 語(yǔ)句來(lái)檢查傳遞進(jìn)來(lái)的 id 參數(shù)。每個(gè) case 應(yīng)該檢查一個(gè)唯一的對(duì)話框 ID 然后創(chuàng)建和定義相應(yīng)的對(duì)話框。比如,想象一下一個(gè)游戲使用兩個(gè)不同的對(duì)話框:一個(gè)用來(lái)指示這個(gè)游戲已經(jīng)暫停而另一個(gè)來(lái)指示游戲結(jié)束。首先,為每個(gè)對(duì)話框定義一個(gè)整數(shù):
static final int DIALOG_PAUSED_ID = 0;
static final int DIALOG_GAMEOVER_ID = 1;
然后,為每一個(gè) ID 用一個(gè) switch case 定義這個(gè) onCreateDialog(int) 回調(diào)函數(shù):
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;
}
注意 : 在這個(gè)例子里, case 語(yǔ)句沒(méi)有具體內(nèi)容,因?yàn)檫@超出了本章討論范圍。
當(dāng)是時(shí)候顯示其中之一的對(duì)話框時(shí),使用對(duì)話框 ID 調(diào)用 showDialog(int) :
showDialog(DIALOG_PAUSED_ID);
消除對(duì)話框 Dismissing a Dialog
當(dāng)你準(zhǔn)備關(guān)閉對(duì)話框時(shí),你可以通過(guò)對(duì)這個(gè)對(duì)話框調(diào)用 dismiss() 來(lái)消除它。如果需要,你還可以從這個(gè)活動(dòng)中調(diào)用 dismissDialog(int) 方法,這實(shí)際上將為你對(duì)這個(gè)對(duì)話框調(diào)用 dismiss() 方法 .
如果你想使用 onCreateDialog(int) 方法來(lái)管理你對(duì)話框的狀態(tài)(就如同在前面的章節(jié)討論的那樣),然后每次你的對(duì)話框消除的時(shí)候,這個(gè)對(duì)話框?qū)ο蟮臓顟B(tài)將由該活動(dòng)保留。如果你決定不再需要這個(gè)對(duì)象或者清除該狀態(tài)是重要的,那么你應(yīng)該調(diào)用 removeDialog(int) 。這將刪除任何內(nèi)部對(duì)象引用而且如果這個(gè)對(duì)話框正在顯示,它將被消除。
使用消除偵聽(tīng)器 Using dismiss listeners
如果你希望你的應(yīng)用程序在一個(gè)對(duì)話框消亡的時(shí)候執(zhí)行一些流程,那么你應(yīng)該附著一個(gè) on-dismiss 偵聽(tīng)器到對(duì)話框上。
首先定義 DialogInterface.OnDismissListener 接口。這個(gè)接口只有一個(gè)方法, onDismiss(DialogInterface) ,將在對(duì)話框消亡的時(shí)候被調(diào)用。然后簡(jiǎn)單的傳遞你的 OnDismissListener 實(shí)現(xiàn)給 setOnDismissListener() 。
然而 , 請(qǐng)注意對(duì)話框也可以被 “ 取消 ” 。這是一個(gè)表明對(duì)話框被用戶(hù)顯示取消的特殊情況。這將在用戶(hù)按 “ 返回 ” 按鈕時(shí)發(fā)生,或者這個(gè)對(duì)話框顯示的調(diào)用 cancel() (也許通過(guò)對(duì)話框上的一個(gè) “ 取消 ” 按鈕)。當(dāng)一個(gè)對(duì)話框被取消時(shí),這個(gè) OnDismissListener 依然會(huì)被通知到,但是如果你希望在對(duì)話框被顯示取消時(shí)被通知到(而不是通常的消除方式),那么你應(yīng)該通過(guò) setOnCancelListener() 注冊(cè)一個(gè) DialogInterface.OnCancelListener 。
創(chuàng)建警告對(duì)話框 Creating an AlertDialog
一個(gè)警告對(duì)話框是對(duì)話框的擴(kuò)展類(lèi)。它能夠構(gòu)建大多數(shù)對(duì)話框用戶(hù)界面并且是推薦使用的對(duì)話框類(lèi)型。你應(yīng)該在具備如下特性的時(shí)候使用它:
· 一個(gè)標(biāo)題
· 一個(gè)文本消息
· 1 個(gè), 2 個(gè)或 3 個(gè)按鈕
· 一個(gè)可選項(xiàng)列表(可選的復(fù)選框或單選按鈕)
為了創(chuàng)建一個(gè)警告對(duì)話框,使用 AlertDialog.Builder 子類(lèi)。通過(guò) AlertDialog.Builder(Context) 獲取一個(gè)構(gòu)造器然后使用這個(gè)類(lèi)的公共方法來(lái)定義警告對(duì)話框的所有屬性。當(dāng)?shù)玫綐?gòu)造器后,通過(guò) create() . 方法來(lái)獲取警告對(duì)話框?qū)ο蟆?
下面的題目說(shuō)明了如何使用 AlertDialog.Builder 類(lèi)來(lái)定義不同的警告對(duì)話框?qū)傩浴H绻阍? onCreateDialog() 回調(diào)函數(shù)中使用下面的代碼,你可以返回結(jié)果對(duì)話框?qū)ο髞?lái)顯示它。
增加按鈕 Adding buttons
為了創(chuàng)建一個(gè)如右圖所示的包含并行按鈕的警告對(duì)話框,使用 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();
首先,為這個(gè)對(duì)話框添加一個(gè)消息 setMessage(CharSequence) 。然后,開(kāi)始函數(shù)鏈并設(shè)置該對(duì)話框?yàn)椴荒苋∠? not cancelable (因此用戶(hù)不能使用返回按鈕關(guān)閉這個(gè)對(duì)話框)。對(duì)每個(gè)按鈕,使用任一 set...Button() 方法,比如 setPositiveButton() ,該方法接受按鈕名稱(chēng)以及一個(gè)定義用戶(hù)選中按鈕后所采取動(dòng)作的 DialogInterface.OnClickListener 。
注意 : 你僅可以為這個(gè)警告對(duì)話框添加其中一種按鈕類(lèi)型。也就是,你不能包含多個(gè)“確定”按鈕。這限制了可能的按鈕數(shù)目只能是 3 個(gè):確定,中立和否定。這些名字和你按鈕的實(shí)際功能是技術(shù)上無(wú)關(guān)的,但是應(yīng)該可以幫助你記錄做了什么。
增加一個(gè)列表 Adding a list
為了創(chuàng)建一個(gè)帶有可選項(xiàng)列表的警告對(duì)話框,如右邊所示,可使用 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) 方法給對(duì)話框添加一個(gè)標(biāo)題。然后,添加用 setItems() 添加一個(gè)可選項(xiàng)列表,該列表接受一組顯示的 items 和一個(gè) DialogInterface.OnClickListener 來(lái)定義用戶(hù)選中按鈕后所采取動(dòng)作。
增加復(fù)選框和單選按鈕
要在對(duì)話框里創(chuàng)建一個(gè)多選項(xiàng)列表( checkboxes )或者單選項(xiàng)( radio buttons ),可分別調(diào)用 setMultiChoiceItems() 和 setSingleChoiceItems() 方法。如果你在 onCreateDialog() 回調(diào)函數(shù)中創(chuàng)建這些可選列表, Android 會(huì)幫你管理列表狀態(tài)。只要這個(gè)活動(dòng)是激活的,對(duì)話框會(huì)記住之前選中的 items ,但如果用戶(hù)退出這個(gè)活動(dòng),用戶(hù)選擇將丟失。
注意 : 為了在用戶(hù)離開(kāi)或暫停這個(gè)活動(dòng)的時(shí)候能夠保存選擇,你必須通過(guò)活動(dòng)生命期 Activity Lifecycle 來(lái)恰當(dāng)?shù)谋4婧突謴?fù)設(shè)置。為了永久保存選項(xiàng),即使活動(dòng)進(jìn)程被完全終止,你需要使用數(shù)據(jù)存儲(chǔ) Data Storage 技術(shù)。
要?jiǎng)?chuàng)建如右邊所示的一個(gè)包含單選項(xiàng)列表的警告對(duì)話框,使用前面例子中相同的代碼,不過(guò)需要把 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() 的第二個(gè)參數(shù)是一個(gè) checkedItem 整型數(shù)值,指示了基于 0 的缺省選擇項(xiàng)的位置。“ -1 ”代表不會(huì)有默認(rèn)選擇項(xiàng)。
創(chuàng)建進(jìn)度對(duì)話框 Creating a ProgressDialog
進(jìn)度對(duì)話框 ProgressDialog 是 AlertDialog 類(lèi)的一個(gè)擴(kuò)展,可以為一個(gè)未定義進(jìn)度的任務(wù)顯示一個(gè)旋轉(zhuǎn)輪形狀的進(jìn)度動(dòng)畫(huà),或者為一個(gè)指定進(jìn)度的任務(wù)顯示一個(gè)進(jìn)度條。這個(gè)對(duì)話框也能提供按鈕,比如一個(gè)取消下載的按鈕。
可以簡(jiǎn)單的通過(guò)調(diào)用 ProgressDialog.show() 方法來(lái)顯示一個(gè)進(jìn)度對(duì)話框。比如, 可以很簡(jiǎn)單的得到右邊顯示的進(jìn)度對(duì)話框,而不必通過(guò) onCreateDialog(int) 回調(diào)管理這個(gè)對(duì)話框,如下所示:
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
第一個(gè)參數(shù)是應(yīng)用程序上下文 Context ,第二個(gè)是對(duì)話框標(biāo)題(此處為空),第三個(gè)是信息,最后這個(gè)參數(shù)表明進(jìn)度是否是不確定的(這只和創(chuàng)建進(jìn)度條有關(guān),下一章會(huì)有描述)。
進(jìn)度對(duì)話框的缺省類(lèi)型是一個(gè)旋轉(zhuǎn)輪,如果你想創(chuàng)建一個(gè)間隔進(jìn)度,需要更多的代碼,如下章所述。
顯示進(jìn)度條 Showing a progress bar
使用動(dòng)畫(huà)進(jìn)度條顯示進(jìn)度:
1. 用類(lèi)構(gòu)造器初始化進(jìn)度對(duì)話框, ProgressDialog(Context) 。
2. 用 setProgressStyle(int) 方法設(shè)置進(jìn)度風(fēng)格為 "STYLE_HORIZONTAL" 以及設(shè)置其它屬性,比如消息。
3. 當(dāng)你準(zhǔn)備顯示這個(gè)對(duì)話框時(shí),調(diào)用 show() 或者從 onCreateDialog(int) 回調(diào)中返回 ProgressDialog 。
4. 你可以通過(guò)調(diào)用 setProgress(int) 設(shè)置當(dāng)前進(jìn)度百分比或者調(diào)用 incrementProgressBy(int) 方法增加進(jìn)度值。
比如,你的設(shè)置可能看起來(lái)像這樣:
ProgressDialog progressDialog;
progressDialog = new ProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
設(shè)置很簡(jiǎn)單。大多數(shù)創(chuàng)建代碼也用來(lái)更新進(jìn)度。你可能意識(shí)到創(chuàng)建另外一個(gè)線程來(lái)完成這個(gè)進(jìn)度報(bào)告的工作是有必要的,進(jìn)度通過(guò)一個(gè)對(duì)象返回給活動(dòng)的用戶(hù)界面線程。如果你對(duì)如何通過(guò)一個(gè) Handler 使用另外的線程不熟悉,請(qǐng)參見(jiàn)下面的例子:
Example ProgressDialog with a second thread
這個(gè)例子使用了另外一個(gè)線程來(lái)跟蹤進(jìn)程進(jìn)度(計(jì)數(shù)到 100 )。這個(gè)線程在每次進(jìn)度更新時(shí)通過(guò)一個(gè)句柄 Handler 發(fā)回一條消息 Message 。主活動(dòng)然后更新進(jìn)度對(duì)話框。
package com.example.progressdialog;
import android.app.Activity;
import android.app.Dialog; EN-US
- 2009-09-22 18:47
- 瀏覽 220
- 評(píng)論(0)
- 相關(guān)推薦
發(fā)表評(píng)論
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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

評(píng)論