轉載請標明出處: http://blog.csdn.net/airsaid/article/details/51155994
本文出自:周遊的博客
前言
Android本身提供了豐富的對話框支持,常見有如下四種常用的對話框:
* AlertDialog:最常用、功能最豐富應用最廣的對話框。
* ProgressDialog:進度條對話框,這個對話框只是對進度條的一個包裝。
* DatePickerDialog:日期選擇對話框,這個Dialog只是對DatePicker的包裝。
* TimePickerDialog:時間選擇對話框,同上。
其中,ProgressDialog、DatePickerDialog、TimePickerDialog都是繼承自AlertDialog。
開發環境
- IDE版本:Android Studio2.0
- 物理機版本:Win7旗艦版(64位)
AlertDialog的使用
AlertDialog的功能十分強大,它可以生成各種各樣的Dialog,下面具體講解下使用。
一般我們創建一個AlertDialog需要如下幾步:
* 1,創建AlertDialog.Builder對象
* 2,調用AlertDialog.Builder的setTitle()或者setCustomTitle()方法設置標題
* 3,調用AlertDialog.Builder的setIcon()方法設置圖標
* 4,調用AlertDialog.Builder的相關設置方法設置對話框內容
* 5,調用AlertDialog.Builder的setPositiveButtom()、setNegativeButtom()或者setNeutralButtom()方法給Dialog添加按鈕
* 6,調用AlertDialog.Builder的create()方法創建AlertDialog對象,再調用AlertDialog.Builder的show()方法顯示Dialog
6步中,可以根據具體Dialog的樣式靈活改變,其中,第4步最爲靈活,AlertDialog允許創建各種內容的對話框,歸納起來,有如下幾種:
* 1,setMessage():設置對話框的內容爲簡單文本。
* 2,setItems():設置對話框的內容爲簡單列表項。
* 3,setSingleChoiceItems():設置對話框的內容爲單選列表項。
* 4,setMultiChoiceItems():設置對話框的內容爲多選列表項。
* 5,setAdapter():設置對話框的內容爲自定義列表項。
* 6,setView():設置對話框的內容爲自定義View。
下面通過幾個實例在介紹具體的用法。
簡單提示消息對話框
/** 顯示簡單對話框 */
private void showDialogForMessage() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("簡單的對話框")
.setIcon(R.mipmap.ic_launcher)
.setMessage("對話框內的內容");
setPositiveButtom(builder);
setNegativeButton(builder)
.create()
.show();
}
由於有多個Dialog需要演示,所以把添加Button的方法重新抽取爲了一個單獨的方法進行復用,下面演示的Dialog都使用到了這兩個方法:
/** 添加確定按鈕 */
public AlertDialog.Builder setPositiveButtom(AlertDialog.Builder builder) {
return builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "點擊了確定按鈕", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/** 設置取消按鈕 */
public AlertDialog.Builder setNegativeButton(AlertDialog.Builder builder) {
return builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "點擊了取消按鈕", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
運行結果:
除了上面用上面兩個方法添加確定和取消Button外,還可以通過 setNeutralButton() 添加一個裝飾性的Button:
簡單列表項對話框
/** 顯示列表項對話框 */
private void shouDialogForItems() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("簡單列表項對話框")
.setIcon(R.mipmap.ic_launcher)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "選擇了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
通過上面的代碼看到,我們通過setItems()創建了一個簡單列表項對話框,參數我們可以傳入一個數組、或者一個數組的資源ID,在本文演示中items都是引用自同一個數組:
String[] items = {"Airsaid", "周遊", "QQ羣:5707887"};
運行結果:
單選列表項對話框
/** 顯示單選列表項對話框 */
private void showDialogForSingleChoiceItems() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("單選列表項對話框")
.setIcon(R.mipmap.ic_launcher)
// 第二個參數:默認選中第幾項
.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "選擇了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
其中,setSingleChoiceItems() 的第一個參數,可以傳入一個數組也可以傳入一個Cursor,還可以傳入一個ListAdapter作爲參數,如果使用ListAdapter作爲參數,
那麼則由ListAdapter來提供多個列表項組件。
運行結果:
多選列表項對話框
/** 顯示多選列表項對話框 */
private void showDialogForMultiChoiceItems() {
boolean[] booleans = {true, true, false};
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("多選列表項對話框")
.setIcon(R.mipmap.ic_launcher)
// 第二個參數:默認選中哪幾項 true:選中 false:不選中
.setMultiChoiceItems(items, booleans, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(MainActivity.this, "選擇了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
多選列表項對話框和上面的單選列表項使用起來類似,只不過參數2的默認選中從int改爲boolean數組。
運行結果:
自定義列表項對話框
/** 顯示自定義列表項對話框 */
private void showDialogForAdapter() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("自定義列表項對話框")
.setIcon(R.mipmap.ic_launcher)
.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
items), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "選擇了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
運行結果:
自定義View對話框:
這個是重頭戲了,因爲在實際開發中,對話框的樣式多種多樣,所以這個時候就需要我們用自定義View來展示不同的效果了,這裏我們簡單演示一個登錄的Dialog:
/** 顯示自定義View對話框 */
private void showDialogForView() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("自定義View對話框")
.setIcon(R.mipmap.ic_launcher)
.setView(R.layout.login);
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
login佈局;
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用戶名:" />
<EditText
android:hint="請輸入用戶名"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="密碼:" />
<EditText
android:hint="請輸入登錄密碼"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
運行結果:
ProgressDialog的使用
ProgressDialog,顧名思義,是一個進度條的對話框。我們在使用的時候,只要創建ProgressDialog的實例,並調用顯示即可。
使用ProgressDialog創建對話框有如下兩種方式:
* 1,創建簡單對話框,直接使用ProgressDialog調用其靜態方法show()顯示對話框。
* 2,創建ProgressDialog,然後調用方法對進度條對話框進行設置,設置完成顯示即可。
ProgressDialog有如下常用方法:
* 1,setIndeterminate(boolean indeterminate); 設置對話框裏的進度條不顯示進度值
* 2,setMax(int max); 設置對話框裏的最大進度條
* 3,setMessage(CharSequence message); 設置進度條裏顯示的消息
* 4,setProgress(int value); 設置進度條的進度值
* 5,setProgressStyle(int style); 設置進度條的樣式
下面以實例來演示ProgressDialog的兩種使用:
使用靜態方法顯示簡單ProgressDialog:
ProgressDialog.show(this, "我是標題", "我是內容");
運行結果:
其中,show()方法還有以下參數:
indeterminate : 設置對話框裏的進度條是否顯示進度值
cancelable:設置對話框是否可以被取消 (當可以被取消時,用戶點擊對話框以外地方,對話框會消失)
cancelListener:監聽進度條被取消事件
環形帶進度的ProgressDialog:
public class ProgressDialogActivity extends AppCompatActivity{
private static final int PROGRESS_MAX = 100;
private ProgressDialog mProgressDialog;
private int mProgress = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progressdialog);
}
public void showProgressDialog(View v) {
mProgress = 0;
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMax(PROGRESS_MAX);
mProgressDialog.setTitle("溫馨提示");
mProgressDialog.setMessage("任務正在下載中,請稍候...");
mProgressDialog.setCancelable(false);
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
while(mProgress < PROGRESS_MAX){
mProgress = mProgress + 5;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
mProgressDialog.setProgress(mProgress);
}
if(mProgress >= PROGRESS_MAX){
mProgressDialog.dismiss();
}
}
}).start();
}
}
運行結果:
DatePickerDialog和TimePickerDialog的使用
DatePickerDialog和TimePickerDialog的使用很簡單,只需要如下兩步:
* 1,創建DatePickerDialog、TimePickerDialog對象,調用它們的show()方法就可以將它們顯示出來。
* 2,爲DatePickerDialog、TimePickerDialog綁定監聽器,這樣可以保證當用戶選擇了日期或者時間後我們這邊能給出對於的操作。
DatePickerDialog實例:
public void showDatePickerDialog(View v) {
Calendar c = Calendar.getInstance();
new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Toast.makeText(DateAndTimePickerDialogActivity.this
, "選擇了:" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日"
, Toast.LENGTH_SHORT).show();
}
// 設置初始日期
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show();
運行結果:
TimePickerDialog實例:
public void showTimePickerDialog(View v) {
Calendar c = Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(DateAndTimePickerDialogActivity.this
, "選擇了:" + hourOfDay + "時" + minute + "分"
, Toast.LENGTH_SHORT).show();
}
// 設置初始時間 true: 表示採用24小時制
}, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true).show();
}
運行結果:
Dialog樣式的Activity
除了上面的各種Dialog之外,我們還可以給Activity設置爲Dialog的風格,Activity還是Activity並且有自己的生命週期但是樣式就變爲Dialog的樣式了:
<activity android:name=".MainActivity"
android:theme="@android:style/Theme.Material.Dialog">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:由於使用到了material design樣式(5.0之後出的),所以我們需要在build.gradle中將minSdkVersion設置爲21。
源碼下載
下載地址:由於以上例子的代碼都比較簡單,所以這篇博客就不貼出Demo下載了,有問題可以加羣討論:5707887