編輯:關於Android編程
一個對話框一般是一個出現在當前Activity之上的一個小窗口. 處於下面的Activity失去焦點, 對話框接受所有的用戶交互. 對話框一般用於提示信息和與當前應用程序直接相關的小功能.
Android API 支持下列類型的對話框對象:
AlertDialog是Dialog的一個直接子類,使用AlertDialog,我們可以顯示一個標題,最多3個按鈕操作,以及一組選擇框或者是自己定義的彈出框。
AlertDialog要使用Builder設計模式來創建對象 。
在時間應用中的對話框基本不用Dialog而是用它的子類。
這裡簡單使用一下Dialog,代碼如下:
// 普通的對話框,普通的對話框功能很少,除非重寫類 public void bt1(View v) { // 創建對話框對象 Dialog dialog = new Dialog(this); // 創建對話框內容 dialog.setTitle("對話框的標題"); // 顯示對話框 dialog.show(); }
運行後顯示結果:
可以看到有一個標題的對話框,而且這裡沒有設置內容的屬性,Dialog的使用方法和功能都是很少的,不建議使用。
代碼設計:
// 警告對話框,需要用Builder方法創建 public void bt2(View v) { // 這裡的屬性可以一直設置,因為每次設置後返回的是一個builder對象 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 設置提示框的標題 builder.setTitle("提示標題"). // 設置提示框的圖標 setIcon(R.drawable.ic_launcher). // 設置要顯示的信息 setMessage("文本的提示信息:你媽喊你回家吃飯了!"). // 設置確定按鈕 setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "選擇就確定哦", 0).show(); } }). // 設置取消按鈕,null是什麼都不做 setNegativeButton("取消", null). // 設置退出按鈕,在中間的按鈕 setNeutralButton("退出", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 退出程序 finish(); } }); // 生產對話框 AlertDialog alertDialog = builder.create(); // 顯示對話框 alertDialog.show(); }
程序運行後顯示的結果:
這裡如果點擊取消,對話框消失,什麼都沒有做。
如果點擊退出,會直接退出程序。
如果點擊確定,會彈出一個土司,提示你。
這裡可以根據用戶的選擇做出相應的行為。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxoMiBpZD0="三設計一個選擇菜單樣式的對話框">(三)設計一個選擇菜單樣式的對話框
代碼設計:
//數據源 String[] array = new String[] { "音樂", "體育", "舞蹈", "看書" }; // 顯示一個菜單的對話框選項,點擊選擇菜單後,菜單會消失 // 匿名類去創建 public void bt3(View v) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); // 設置標題 builder.setTitle("選擇你最喜歡的課程"). // 設置可選擇的內容,並添加點擊事件 setItems(array, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // which代表的是選擇的標簽的序列號 Toast.makeText(MainActivity.this, "選擇" + array[which], 0).show(); } }). // 產生對話框,並顯示出來 create().show(); }
程序運行後顯示的結果:
設置菜單是builder的setItem方法來完成的。 點擊某一個菜單選項後對話框會自動消失,所以這裡設置按鈕也是沒有什麼用處的。 這裡還能監聽點擊菜單的事件,獲取用戶的選擇內容。
其實這個對話框和上面的菜單對話框差不多,只是樣式改變了,還有一點不同的是點擊一個選項後對話框是不會消失的,所以必須要設置按鈕,來使對話框消失。
代碼設計:
// 單選按鈕的對話框,選擇一個按鈕值後, // 對話框也是不會自動消失,需要自己關閉 // 要設置按鈕,點擊按鈕後對話框才會消失 public void bt4(View v) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); // 設置標題 builder.setTitle("選擇你最喜歡的課程"). // 設置可選擇的內容,並添加點擊事件 // 第一個參數是可以選擇的單選框的內容 // 第二個參數是默認選中的項 // 第三個參數是點擊選中的監聽器 setSingleChoiceItems(array, 0, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "選擇" + array[which], 0).show(); } }). // 因為對話框不會自動消失,所以要添加按鈕的必要 // 設置確定按鈕 setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "選擇確定", 0).show(); } }). // 取消,什麼都不做,對話框消失而已 setNegativeButton("取消", null). // 產生對話框,並顯示出來 create().show(); }
運行後的結果:
設置單選菜單是builder的setSingleChoiceItem方法來完成的。 這裡要可以設置兩個監聽事件,一個是單選按鈕某一個選項被選中時觸發的,另一個是點擊按鈕時觸發的事件。 程序中每次選中一個單選按鈕都會彈出一個吐司,提示你選擇的內容,點擊確定後也會顯示一個吐司。
多選框的顯示和單選的顯示也是有點相似的,都是需要設置按鈕來使對話框消失。
代碼如下:
// 多選按鈕的對話框 // 對話框也是不會自動消失,需要自己關閉 // 要設置按鈕,點擊按鈕後對話框才會消失 public void bt5(View v) { // 多選按鈕的默認狀態 boolean[] checkedItems = { true, false, false, true }; // 多選按鈕選中後保存的數據 final Listlist = new ArrayList (); // 默認的數據 list.add("音樂"); list.add("看書"); // 創建對話框的builder對象 final AlertDialog.Builder builder = new AlertDialog.Builder(this); // 設置標題 builder.setTitle("選擇你最喜歡的課程"). // 設置可選擇的內容,並添加點擊事件 // 第一個參數是可以選擇的選框的內容 // 第二個參數是一個布爾數組,如果是true代表的是默認選中 // 第三個參數是點擊選中的監聽器 setMultiChoiceItems(array, checkedItems, new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { // 這裡無論某個選項是被選中後被取消都會觸發該方法 // which代表的是選中的是多少游標值的選項 // isChecked是代表該選項是或否選中了 // 判斷如果集合中有某個數據,就把他移除,否則就添加數據 // 注意這裡數選擇之後的狀態 if (isChecked) { // 添加數據 list.add(array[which]); } else { // 移除數據 list.remove(array[which]); } } }). // 因為對話框不會自動消失,所以要添加按鈕的必要 // 設置確定按鈕 setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "你選中了" + list, 0) .show(); } }). // 取消,什麼都不做,對話框消失而已 setNegativeButton("取消", null). // 產生對話框,並顯示出來 create().show(); }
程序運行後的結果:
設置多選菜單是builder的setMultiChoiceItem方法來完成的。 這裡要可以設置兩個監聽事件,一個是選項框的某一個選項的狀態改變時觸發的,另一個是點擊按鈕時觸發的事件。 程序中每次改變選項的內容,保存數據的集合都會改變,點擊確定後也會顯示一個吐司,顯示集合裡面的內容。
選擇全部內容後,確定,顯示的結果:
使用適配器顯示對話框和顯示菜單對話框類似,都是選中對應選項後,對話框自動消失,但是使用適配器可以顯示很負責的界面。
// 使用適配器顯示對話框-->builder的setAdapter方法 // 這裡選擇一個選項後,對話框就會關閉,所以是不需要設置按鈕的 // 其實這裡可以設置很復雜的適配器對象,但是實際應用中不會在對話框顯示太復雜的布局 public void bt6(View v) { // 創建ArrayAdapter適配器 // android.R.layout.simple_list_item_1是Android系統裡面的簡單布局 // 第三個參數是數據源 ArrayAdapteradapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, array); // 創建對話框對象 new AlertDialog.Builder(this). // 設置標題 setTitle("使用適配器顯示數據"). // 添加適配器,並為適配器添加點擊事件 setAdapter(adapter, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // which是選擇的條目的游標值 Toast.makeText(MainActivity.this, "選擇" + array[which], 0).show(); } }). // 產生並顯示 create().show(); }
運行程序後顯示的結果:
設置多選菜單是builder的setAdapter方法來完成的。 這裡要設置一個監聽事件,適配器的監聽事件。 這裡點擊某一個選項後,對話框消失,並土司選中的內容。
// 設置一個有輸入文本的對話框---->builder的setView方法 // 輸入數據後,對數據進行處理 // 這裡要設置按鈕,才能對數據的數據進行處理 public void bt7(View v) { // 創建一個EditText對象 final EditText et = new EditText(this); // 創建對話框對象 new AlertDialog.Builder(this). // 設置標題 setTitle("有輸入框的對話框"). // 添加輸入的文本框 setView(et). // 添加確定按鈕 setPositiveButton("確定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 獲取輸入的字符 String in = et.getText().toString(); Toast.makeText(MainActivity.this, "輸入;" + in, 0).show(); } }).setNegativeButton("取消", null). // 產生並顯示 create().show(); }
運行後的結果:
設置輸入框是builder的setView方法來完成的。 這裡要設置一個按鈕監聽事件。 這裡點擊確定按鈕後,獲取輸入框的內容並土司出來。
這裡使用對話框內的一個布局文件的按鈕,來關閉對話框
// 使用對話框內的控件來關閉對話框 public void bt8(View v) { // 創建一個EditText對象 final Button btn = new Button(this); // 給按鈕設置文字 btn.setText("關閉對話框"); // 創建對話框對象 final AlertDialog dialog = new AlertDialog.Builder(this). // 設置標題 setTitle("通過按鈕關閉對話框"). // 添加輸入的文本框 setView(btn). // 產生 create(); // 設置對話框不可以關閉,一般情況下對話框是失去焦點後自動消失的 // 但是加 了.setCancelable(false),對話框就不會消失,除非手動退出 dialog.setCancelable(false); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 點擊後關閉對話框,兩種方法都可以 dialog.cancel(); //dialog.dismiss(); } }); // 顯示 dialog.show(); //給對話框設置一個監聽時間,對話框退出前會執行 dialog.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // 只要關閉都會調用 Toast.makeText(MainActivity.this, "關閉", Toast.LENGTH_SHORT) .show(); } }); }
運行結果:
這裡設置了dialog.setCancelable(false);的屬性,代表了對話框不能隨著焦點的失去而消失對話框,要收到關閉對話框,要麼設置確定和取消按鈕,要麼在對話框布局中設置能夠關閉對話框的控件;
對話框的全部屬性表現,如圖所示:
這裡分上、中、下三部分。
區域一是標題相關
區域二是主體相關
區域三是按鈕相關
其中任何部分都可以不設置,
但是有一點要注意的是主體內容只能有一種,比如:設置了SetMessage不能再設置SetAdapter或SetView。因為設置了也不會顯示的。
包括標題名或者是一個圖標。
(1)setTitle : 為對話框設置標題
(2)setIcon : 為對話框設置圖標
在這裡我們可以設置一些message信息,或者是定義一組選擇框,還可以定義我們自己的布局彈出框。
(1)setMessage: 為對話框設置內容,如果設置了其他內容,那麼Message不要設置,否者只顯示Message。
(2)setView: 給對話框設置自定義View
setItems: 設置對話框要顯示的一個list,一般用於顯示幾個命令時
//items是傳入一個字符串數組,或者是R文件中的數組
(3)setSingleChoiceItems: 用來設置對話框顯示一系列的單選按鈕
(4)setMultiChoiceItems: 用來設置對話框顯示一系列的復選框
這裡我們可以定義我們的操作按鈕。
在AlertDialog中,定義按鈕都是通過 setXXXButton 方法來完成,其中一共有3種不同的Action Buttons供我們選擇:
(1)setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當於OK、確定操作的按鈕.
(2)setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當於取消操作的按鈕。
(3)setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
這個是相當於一個忽略操作的按鈕。
觸發相關按鈕都的行為都是我們程序員自己定的,比如你可以設置點擊確定後關閉頁面,也可以設置點擊取消後關閉頁面。但是我們設計的時候還是要按照大部分人的閱讀習慣來設定。
在AlertDialog的各種設置中,都充斥著DialogInterface.OnClickListener,比如按鈕,內容區的items,單選按鈕等,只有多選按鈕是用了另外一個監聽
DialogInterface.OnMultiChoiceClickListener。
(1)單選按鈕的監聽
public void onClick(DialogInterface dialog, int which);
//which代表items,單選按鈕中的序號
(2)多選按鈕的監聽
public void onClick(DialogInterface dialog, int which, boolean isChecked);
//which代表items,單選按鈕中的序號
//isChecked代表當前點擊的序號是否被勾選
(3)Adapter的監聽
AlertDialog還支持ListAdapter的子類,我們可以傳入各種ListAdapter的子類,來顯示復雜的列表,當然直接使用 setView 也可以辦到
public Builder setAdapter(final ListAdapter adapter, final
OnClickListener listener)
ProgressDialog是AlertDialog類的子類,可以為一個未定義進度的任務顯示一個旋轉輪形狀的進度動畫,或者為一個指定進度的任務顯示一個進度條。它的用處非常廣泛,在每次用戶操作一個延遲的任務時,我們都必須以進度對話框的形式告訴用戶,否者用戶並不知道操作已經開始,可能會多次操作同一個任務,並有可能導致異常發生。
1.構造方法需要傳入一個上下文
public ProgressDialog(Context context)
2.給定一個樣式,帶進度條和不帶進度條的樣式
public void setProgressStyle(int style) //可選值
//STYLE_SPINNER 默認 圓形,沒有進度條的樣式
//STYLE_HORIZONTAL 給定進度條的樣式
3.設置進度最大值,需要給定STYLE_HORIZONTAL
public void setMax(int max)
4.是否能用返回鍵關閉 true可以關閉,false不能關閉
public void setCancelable(boolean flag)
5.設置一個消息
public void setMessage(CharSequence message)
6.判斷Dialog是否顯示
public boolean isShowing()
7.關閉對話框
public void dismiss()
8.ProgressDialog從AlertDialog中繼承的常用方法setIcon和setTitile
9.雖然ProgressDialog可以設置Button,但是我們一般都不會去使用它
// 顯示圓形的進度框 public void bt1(View v) { // 創建進度條的對話框 ProgressDialog dialog = new ProgressDialog(this); // 設置進度條的樣式,選擇圓形或條狀 // 這裡這圓形的 dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 設置標題 dialog.setTitle("文件下載"); // 設置文本信息 dialog.setMessage("正在下載。。。"); // 設置是否能用後退鍵出對話框 // 選擇false就代表不能 // 如果設置為false,程序可能退出不了 dialog.setCancelable(true); // 顯示對話框 dialog.show(); }
程序運行後的結果:
這裡點擊進度對話框的其他地方,對話框就消失了。因為默認情況,對話框失去焦點就會消失。
// 顯示設置水平的進度框 public void bt2(View v) { // 創建進度條的對話框 final ProgressDialog dialog = new ProgressDialog(this); // 設置進度條的樣式,選擇圓形或條狀 // 這裡這圓形的 dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 設置標題 dialog.setTitle("文件下載"); // 設置文本信息 dialog.setMessage("正在下載。。。"); // 設置是否能用後退鍵出對話框 // 選擇false就代表不能 // 如果設置為false,程序可能退出不了 dialog.setCancelable(false); // 顯示對話框 dialog.show(); // 這裡新建一個線程來,跟新進度和關閉頁面 new Thread(new Runnable() { @Override public void run() { // 獲取進度值的當前的值 int index = 0; // 跟新進度 while (index < dialog.getMax()) { index++; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // 設置進度的值 dialog.setProgress(index); } // 完成任務後,退出對話框 dialog.cancel(); } }).start(); }
運行結果:
這個進度對話框是沒有辦法取消的,因為設置了:dialog.setCancelable(false);
只能等到文件下載完成後對話框自動消失。這個設置在實際應用中也是會有用到的,比如復制文件,不能隨便打斷。本示例中,進度的跟新需要用子線程來更新,進度條的更新可以直接在子線程中實現,而其他布局的跟新是不能在子線程中直接更新的。要使用runOnUIThread();方法來更新主線程的界面,
DatePickerDialog與TimePickerDialog都繼承於AlertDialog,基本方法和我們前面講的DatePicker和TimePicker組件一樣,只是需要調用Dialog的show方法來顯示。在構造方法裡需要傳入回調監聽
public interface OnTimeChangedListener { void onTimeChanged(TimePicker view, int hourOfDay, int minute);
}
public interface OnDateChangedListener { void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth);
}
// 顯示時間的對話框 public void btn1(View v) { // 第一個參數是上下文 // 第二個參數是監聽時間選擇後的事件 // 後面兩個數是默認是時間 // 後一個是代表是否顯示時間的格式是24小時制的 TimePickerDialog dialog = new TimePickerDialog(this, new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Toast.makeText(MainActivity.this, hourOfDay + "時" + minute + "分", 0).show(); } }, 21, 8, true); //顯示標題 dialog.setTitle("選擇你要設定的時間"); // 顯示時間的對話框 dialog.show(); }
運行後顯示的結果:
這是時間對話框的選擇按鈕,其中也可以設置很多屬性。
這裡點擊完成後會彈出一個選擇的時間的土司。
如圖所示:
// 顯示日期的對話框 public void btn2(View v) { // 第一個參數是上下文 // 第二個參數是監聽時間選擇後的事件 // 後面三個數是默認是日期數 DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() { // 日期選擇器上的月份是從0開始的 @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Toast.makeText( MainActivity.this, year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日", 0).show(); } }, 2016, 11, 13); // 顯示時間的對話框 dialog.show(); }
點擊運行後,顯示結果:
上面是日期對話框的默認畫面,也是挺好看的,實際中也可以根據實際需要對它的頁面樣式進行修改。
點擊完成後顯示的結果:
總結:
以上就是Android對話框大部分控件的基本使用。
對於有些對話框選擇之後對話框會自動消失,就沒有必要設置ActionButton了
但是有些對話框是不會自動消失的,就需要設置ActionButton或在頁面布局中有可以關掉對話框的控件。
對於有些界面沒有設計得很好看,這個需要自己花時間去慢慢琢磨,這裡只是介紹它們的用法和一些屬性。還有它們的簡單效果。
一、概述在Android的開發中,經常聽到“內存洩漏”這個詞。“內存洩漏”就是一個對象已經不需要再使用了,但是因為其它的對象持有該對象的引用,導致它的內存不能被回收。“內
文件上傳可能是一個比較耗時的操作,如果為上傳操作帶上進度提示則可以更好的提高用戶體驗,最後效果如下圖: &nbs
這裡記錄一個比較方便的方式來解決Textview設置不同顏色的字體的方法。可能第一反應是布局的嵌套,這個方法肯定可以啊,但是肯定不推薦啊,布局要盡量減少布局的嵌套,其次,
《Struck:Structured Output Tracking with Kernels》是Sam Hare, Amir Saffari, Philip H. S.