前言
對話框對於應用也是必不可少的一個組件,在Android中也不例外,對話框對於一些提示重要信息,或者一些需要用戶額外交互的一些內容很有幫助。本篇博客就講解一下Android下對話框的使用,在本篇博客中,將了解到對話框的一些常規屬性的設置,以及各式的對話框的使用,並都會提供小Demo來展示所有的效果。
Dialog
Dialog,對話框,一個對話框就是一個小窗口,並不會填滿整個屏幕,通常是以模態顯示,要求用戶必須采取行動才能繼續進行剩下的操作。
Android提供了豐富的對話框支持,它提供了如下4中常用的對話框:
- AlertDialog:警告對話框,使用最廣泛功能最豐富的一個對話框。
- ProgressDialog:進度條對話框,只是對進度條進行了簡單的封裝。
- DatePickerDialog:日期對話框。
- TimePickerDialog:時間對話框。
所有的對話框,都是直接或間接繼承自Dialog類,而AlertDialog直接繼承自Dialog,其他的幾個類均繼承自AlertDialog。
AlertDialog
AlertDialog繼承自Dialog類,對於Android內置的AlertDialog,它可以包含一個標題、一個內容消息或者一個選擇列表、最多三個按鈕。而創建AlertDialog推薦使用它的一個內部類AlertDialog.Builder創建。使用Builder對象,可以設置AlertDialog的各種屬性,最后通過Builder.create()就可以得到AlertDialog對象,如果只是還需要顯示這個AlertDialog,一般可以直接使用Builder.show()方法,它會返回一個AlertDialog對象,並且顯示它。
如果僅僅是需要提示一段信息給用戶,那么就可以直接使用AlertDialog的一些屬性設置提示信息,涉及到的方法有:
- AlertDialog create():根據設置的屬性,創建一個AlertDialog。
- AlertDialog show():根據設置的屬性,創建一個AlertDialog,並且顯示在屏幕上。
- AlertDialog.Builder setTitle():設置標題。
- AlertDialog.Builder setIcon():設置標題的圖標。
- AlertDialog.Builder setMessage():設置標題的內容。
- AlertDialog.Builder setCancelable():設置是否模態,一般設置為false,表示模態,要求用戶必須采取行動才能繼續進行剩下的操作。
Tips:AlertDialog.Builder的很多設置屬性的方法,返回的均是這個AlertDialog.Builder對象,所以可以使用鏈式方式編寫代碼,這樣更方便。
當一個對話框調用了show()方法后,展示到屏幕上,如果需要消除它,可以使用DialogInterface接口聲明的兩個方法,cancel()和dismiss()使對話框取消或者消除,這兩個方法的作用是一樣的,不過推薦使用dismiss()。Dialog和AlertDialog都實現了DialogInterface接口,所以只要是對話框,均可以使用這兩個方法來消除對話框。
下面通過一個簡單的Demo,先看看AlertDialog是如何提示信息的:
示例:
1 btnGeneral.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // TODO Auto-generated method stub 6 AlertDialog.Builder builder = new AlertDialog.Builder( 7 MainActivity.this); 8 builder.setTitle("提示"); 9 builder.setMessage("這是一個普通的對話框!"); 10 builder.setIcon(R.drawable.ic_launcher); 11 builder.setCancelable(false); 12 builder.setPositiveButton("知道了!", new OnClickListener() { 13 @Override 14 public void onClick(DialogInterface dialog, int which) { 15 dialog.cancel(); 16 } 17 }); 18 builder.create().show(); 19 } 20 });
展示效果:
AlertDialog的按鈕
AlertDialog內置了三個按鈕,可以直接使用setXxxButton()方法進行設置,對於一般的對話框,使用三個按鈕基本上也夠用了,下面是這三個方法的簽名:
- AlertDialog.Builder setPositiveButton(CharSquence text , DialogInterFace.OnClickListener):一個積極的按鈕,一般用於“OK”或者“繼續”等操作。
- AlertDialog.Builder setNegativeButton(CharSquence text , DialogInterFace.OnClickListener):一個負面的按鈕,一般用於“取消”操作。
- AlertDialog.Builder setNeutralButton(CharSquence text , DialogInterFace.OnClickListener):一個比較中性的按鈕,一般用於“忽略”、“以后提醒我”等操作。
上面介紹的DialogInterface接口,還提供了一系列的事件響應,這三個按鈕均需要傳遞一個DialogInterFace.OnClickListener接口對象,實現其點擊事件的觸發,在這個接口中需要實現一個onClick(DialogInterface dialog,int which),dialog為當前觸發事件的對話框對象接口,可以直接強制轉換為AlertDialog進行操作;which為點擊按鈕的標識符,是一個整形的數據,對於這三個按鈕而言,每個按鈕使用不同的int類型數據進行標識:Positive(-1)、Negative(-2)、Neutral(-3)。
而除了專門為按鈕點擊實現的DialogInterFace.OnClickListener事件外,DialogInterface還提供了一些其他的事件,供Dialog對象響應,這些事件只是對Dialog聲明周期各個狀態的響應,一看就明白了,就不再詳細講解了,下面是這幾個事件的說明:
- interface DialogInterface.OnCancelListener:當對話框調用cancel()方法的時候觸發。
- interface DialogInterface.OnDismissListener:當對話框調用dismiss()方法的時候觸發。
- interface DialogInterface.OnShowListener:當對話框調用show()方法的時候觸發。
- interface DialogInterface.OnMultiChoiceListener:當對話框使用多選列表,並且選中的時候觸發。
示例:
1 btnButtons.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // TODO Auto-generated method stub 6 AlertDialog.Builder builder = new AlertDialog.Builder( 7 MainActivity.this); 8 builder.setTitle("提示"); 9 builder.setMessage("這是一個多按鈕普通的對話框!"); 10 builder.setIcon(R.drawable.ic_launcher); 11 builder.setPositiveButton("確定", new OnClickListener() { 12 13 @Override 14 public void onClick(DialogInterface dialog, int which) { 15 Toast.makeText(MainActivity.this, "確定被點擊", 16 Toast.LENGTH_SHORT).show(); 17 dialog.dismiss(); 18 } 19 }); 20 builder.setNegativeButton("否定", new OnClickListener() { 21 22 @Override 23 public void onClick(DialogInterface dialog, int which) { 24 // TODO Auto-generated method stub 25 Toast.makeText(MainActivity.this, "否定被點擊", 26 Toast.LENGTH_SHORT).show(); 27 dialog.dismiss(); 28 } 29 }); 30 builder.setNeutralButton("忽略", new OnClickListener() { 31 32 @Override 33 public void onClick(DialogInterface dialog, int which) { 34 // TODO Auto-generated method stub 35 Toast.makeText(MainActivity.this, "忽略被點擊", 36 Toast.LENGTH_SHORT).show(); 37 dialog.cancel(); 38 } 39 }); 40 builder.show(); 41 } 42 });
展示效果:
AlertDialog的列表形式
AlertDialog除了展示一些提示信息,還可以展示一種列表的形式,需要使用到Builder.setItems(CharSequence[] items,DialogInterface.OnClickListener listener)方法進行設置,它需要傳遞一個CharSequenece類型的數組,以綁定列表的數據,它同樣需要傳遞一個DialogInterface.OnClickListener接口,以響應列表項的點擊,而這個接口中onClick方法的which參數,為當前點擊觸發項的items中的下標。
示例:
1 btnListView.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // TODO Auto-generated method stub 6 AlertDialog.Builder builder = new AlertDialog.Builder( 7 MainActivity.this); 8 builder.setTitle("請選擇城市"); 9 //items使用全局的finalCharSequenece數組聲明 10 builder.setItems(items, new OnClickListener() { 11 @Override 12 public void onClick(DialogInterface dialog, int which) { 13 // TODO Auto-generated method stub 14 String select_item = items[which].toString(); 15 Toast.makeText(MainActivity.this, 16 "選擇了---》" + select_item, Toast.LENGTH_SHORT) 17 .show(); 18 } 19 }); 20 builder.show(); 21 } 22 });
效果展示:
AlertDialog的單選列表
AlertDialog還可以使用一種單選的列表樣式,使用Builder.setSingleChoiceItems(CharSequenece[] items,int checkedItem,DialogInterface.OnClickListener listener),這個方法具有多項重載,主要是為了應對不同的數據源,items為列表項數組,checkedItem為初始選項,listener為點擊響應事件。有時候並不一定需要選中之后就關閉對話框,可以設置兩個按鈕,用於確定選擇。
示例:
1 btnListViewSingle.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 // TODO Auto-generated method stub 5 AlertDialog.Builder builder = new AlertDialog.Builder( 6 MainActivity.this); 7 builder.setTitle("請選擇一下城市"); 8 builder.setSingleChoiceItems(items, 1, new OnClickListener() { 9 10 @Override 11 public void onClick(DialogInterface dialog, int which) { 12 // TODO Auto-generated method stub 13 String select_item = items[which].toString(); 14 Toast.makeText(MainActivity.this, 15 "選擇了--->>" + select_item, Toast.LENGTH_SHORT) 16 .show(); 17 } 18 }); 19 builder.setPositiveButton("確定", new OnClickListener() { 20 @Override 21 public void onClick(DialogInterface dialog, int which) { 22 dialog.dismiss(); 23 } 24 }); 25 builder.show(); 26 } 27 });
效果展示:
AlertDialog多選列表
AlertDialog除了單選列表,還有多選的列表。可以使用Builder.setMultiChoiceItems(CharSequence[] items,boolean[] checkedItems,DialogInterface.OnMultiChoiceClickListener listener),這個方法也同樣具有多樣重載,對於這個方法,items以一個數組為數據源;checkedItems是默認的選項,因為是多選列表,所以如果設置需要全部設置,如果沒有默認選中,則傳Null;listener為多選項點擊觸發事件。
示例:
1 btnListViewMulti.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // TODO Auto-generated method stub 6 AlertDialog.Builder builder = new AlertDialog.Builder( 7 MainActivity.this); 8 builder.setTitle("請選擇城市"); 9 builder.setMultiChoiceItems(items, new boolean[] { true, false, 10 true }, new OnMultiChoiceClickListener() { 11 @Override 12 public void onClick(DialogInterface dialog, int which, 13 boolean isChecked) { 14 // TODO Auto-generated method stub 15 String select_item = items[which].toString(); 16 Toast.makeText(MainActivity.this, 17 "選擇了--->>" + select_item, Toast.LENGTH_SHORT) 18 .show(); 19 } 20 }); 21 builder.setPositiveButton("確定", new OnClickListener() { 22 @Override 23 public void onClick(DialogInterface dialog, int which) { 24 dialog.dismiss(); 25 } 26 }); 27 builder.show(); 28 } 29 });
效果展示:
AlertDialog自定義樣式
有些時候,Android自帶的一些樣式設置已經無法滿足需求了,那么可以使用自定義樣式,自定義個XML布局文件,用這個文件的內容作為AlertDialog的樣式展示在屏幕上,這樣就可以靈活定制對話框了。對於定制的XML文件,可以使用LayoutInflater.from(Context).inflate(int,ViewGroup)的方式對其進行動態加載,然后使用Builder.setView(View)把加載的視圖與Builder對象進行關聯,最后正常show()即可。
布局代碼:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context=".MainActivity" > 11 12 <Button 13 android:id="@+id/btnGeneral" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="普通對話框" /> 17 18 <Button 19 android:id="@+id/btnButtons" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:text="多按鈕的普通對話框" /> 23 24 <Button 25 android:id="@+id/btnListView" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:text="列表選擇對話框" /> 29 30 <Button 31 android:id="@+id/btnListViewSingle" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" 34 android:text="單選列表選擇對話框" /> 35 36 <Button 37 android:id="@+id/btnListViewMulti" 38 android:layout_width="wrap_content" 39 android:layout_height="wrap_content" 40 android:text="多選列表選擇對話框" /> 41 42 <Button 43 android:id="@+id/btnProgressDialog" 44 android:layout_width="wrap_content" 45 android:layout_height="wrap_content" 46 android:text="滾動等待對話框" /> 47 48 <Button 49 android:id="@+id/btnProgressDialogH" 50 android:layout_width="wrap_content" 51 android:layout_height="wrap_content" 52 android:text="進度條對話框" /> 53 <Button 54 android:id="@+id/btnCustomDialog" 55 android:layout_width="wrap_content" 56 android:layout_height="wrap_content" 57 android:text="自定義對話框" /> 58 </LinearLayout>
實現代碼:
1 btnCustomDialog.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); 6 View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_signin,null); 7 Button btn=(Button)view.findViewById(R.id.btnCustom); 8 btn.setOnClickListener(new View.OnClickListener() { 9 10 @Override 11 public void onClick(View v) { 12 // TODO Auto-generated method stub 13 alertDialog.dismiss(); 14 Toast.makeText(MainActivity.this, "表單填寫完成", 15 Toast.LENGTH_SHORT).show(); 16 } 17 }); 18 builder.setView(view); 19 alertDialog=builder.show(); 20 } 21 });
效果展示:
ProgressDialog
有些時候,只是需要提示用戶等待,比如在執行耗時操作等的時候,可以使用進度對話框來顯示一個進度信息,提示用戶等待,這個時候可以使用ProgressDialog。ProgressDialog的使用方式大部分可以參見ProgressBar,其實就是一個封裝了ProgressBar的對話框。
ProgressDialog有兩種顯示方式,一種是以一個滾動的環狀圖標,可以顯示一個標題和一段文本內容的等待對話框;另外一種是帶刻度的進度條,和常規的進度條用法一致。兩種樣式通過ProgressDialog.setProgressStyle(int style)設置,可以通過ProgressDialog的兩個常量進行設置:STYLE_HORIZONTAL:刻度滾動;STYLE_SPINNER:圖標滾動,默認選項。
對於圖標滾動,可以使用兩種方式實現,一種是常規的調用構造函數,再設置對應的屬性;另外一種是直接使用ProgressDialog的靜態方法show(),直接返回一個ProgressDialog對象,並且調用show()方法。
示例:
1 btnProgressDialog.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // 第一種方法,使用ProgressDialog構造函數 6 progressDialog = new ProgressDialog(MainActivity.this); 7 progressDialog.setIcon(R.drawable.ic_launcher); 8 progressDialog.setTitle("等待"); 9 progressDialog.setMessage("正在加載...."); 10 progressDialog.show(); 11 //第二種方法,使用靜態的show方法 12 //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false); 13 new Thread(new Runnable() { 14 15 @Override 16 public void run() { 17 try { 18 Thread.sleep(5000); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 finally{ 23 progressDialog.dismiss(); 24 } 25 } 26 }).start(); 27 } 28 });
效果展示:
對於有刻度的ProgressDialog,除了從AlertDialog中繼承來的屬性,有一些必要的屬性需要設置,以下方法都有對應的getter方法:
- setMax(int max):最大刻度。
- setProgress(int value):第一進度。
- setSecondaryProgress(int value):第二進度。
示例:
1 btnProgressDialog.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 // 第一種方法,使用ProgressDialog構造函數 6 progressDialog = new ProgressDialog(MainActivity.this); 7 progressDialog.setIcon(R.drawable.ic_launcher); 8 progressDialog.setTitle("等待"); 9 progressDialog.setMessage("正在加載...."); 10 progressDialog.show(); 11 //第二種方法,使用靜態的show方法 12 //progressDialog=ProgressDialog.show(MainActivity.this, "等待", "正在加載....", false, false); 13 new Thread(new Runnable() { 14 15 @Override 16 public void run() { 17 try { 18 Thread.sleep(5000); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 finally{ 23 progressDialog.dismiss(); 24 } 25 } 26 }).start(); 27 } 28 });
效果展示:
總結
以上就介紹了常用的對話框的內容,DatePickerDialog和TimePickerDialog在另外一篇博客中有介紹到,可以看看:Android--UI之DatePicker、TimePicker... 。從最新的官方文檔上了解到,推薦使用FragmentDialog來操作Dialog,這樣便於管理,有關Fragment的內容,還沒有介紹,以后介紹了Fragment之后再說說怎么使用FragmentDialog來創建對話框。在源碼里有一個FragmentDialog的簡單例子,有興趣的可以下載下來看看。