對話框:AlertDialog
前兩節(jié)我們講到了 Toast 和 Notification,這兩個屬于單向的通知,也就是說只能由我們給用戶傳遞信息,而不能接收用戶的選擇。當你希望在 Acitivity 內(nèi)給用戶傳遞信息的同時給用戶一些選擇權(quán),并且不希望切換屏幕頁面的時候,AlertDialog 將是最佳的選擇。
1. AlertDialog 的特性
對話框是一個可以用來展示提示信息并支持用戶輸入的小彈窗
AlertDialog 可以用來讓用戶提交問題、做選擇、確定/取消操作、向用戶發(fā)送通知、錯誤等信息。它可以幫助我們在不跳轉(zhuǎn) Activity 的情況下輕松彈出一個懸浮窗,在本節(jié)課程中,我們會討論如何創(chuàng)建各種各樣常見的對話框。
2. AlertDialog 的常用 API
AlertDialog 在使用中主要以 API 為主,常用方法如下:
- setIcon(Drawable icon):
設置Alert Dialog窗口的icon - setCancelable(boolean cancel able):
設置是否支持取消(取消通常是指點窗口外或者點“Back”) - setTitle(CharSequence title):
設置對話框上的標題 - setMessage(CharSequence message):
設置對話框上的提示信息 - setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener):
在對話框上添加多選列表,參數(shù)描述:- items:多選項文本數(shù)組
- checkedItems:默認狀態(tài),true表示默認選中;false默認取消
- listener:用戶選擇監(jiān)聽器
- setOnCancelListener(DialogInterface.OnCancelListener onCancelListener):
設置關(guān)閉監(jiān)聽器,在用戶關(guān)閉的時候回調(diào)此接口 - setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener):
設置確定監(jiān)聽器,在用戶點擊確定的時候回調(diào)此接口 - setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener):
設置取消監(jiān)聽器,在用戶選擇“取消”、“否定”等時候毀掉此接口
3. AlertDialog 的使用方法
AlertDialog 的用法和上一節(jié)的 Notification 類似,系統(tǒng)也提供了 Builder 建造者,通過 Builder 的create()
方法可以創(chuàng)建對話框,然后通過show()
方法展示,如下:
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
3.1 使用步驟
Step 1: 創(chuàng)建AlertDialog.Builder對象
我們也可以直接創(chuàng)建 AlertDialog,但這樣不方便我們自定義一些功能及樣式,所以更多時候還是會采用構(gòu)建者模式中的 Builder 對象幫助我們?nèi)?gòu)建我們需要的 AlertDialog。
Step 2: 設置對話框的內(nèi)容樣式
這里主要涉及到圖標icon、標題以及提示內(nèi)容四個部分,對應以下 3 個接口:
- setIcon
- setTitle
- setMessage
這幾個是幾乎所有對話框都會用到的方法,對于一些特殊樣式的 AlertDialog 還會有一些特殊接口,具體的方法我們會在下一個小節(jié)看到。
Step 3: 設置按鈕
分別調(diào)用setPositiveButton()
、setNegativeButton()
、setNeutralButton()
來設置“確定”、“取消”、“中立”按鈕的顯示文本及點擊事件回調(diào)。
Step 4: 創(chuàng)建 AlertDialog對象并展示
在設置完對話框的樣式之后,我們直接調(diào)用 Builder 的create()
方法創(chuàng)建 AlertDialog 實例,最后調(diào)用 show()
方法將對話框顯示出來。
3.2 普通對話框
一個普通的 AlertDialog 也是大家日常見到最多的一種,直接彈出一個提示,然后給出 1 - 3 個選項,比如“是”、“否”、“取消”等等,使用方法非常簡單,基本上可以直接套用 3.1小節(jié)的步驟,代碼如下:
package com.emercy.myapplication;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.alert).setOnClickListener(this);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog alertDialog = builder
.setIcon(R.drawable.warning)
.setTitle("系統(tǒng)消息:")
.setMessage("彈出一個普通的AlertDialog,\n提供確定、退出、取消三個Button")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "已確定", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "已為您取消", Toast.LENGTH_SHORT).show();
}
}).setNeutralButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "已退出對話框", Toast.LENGTH_SHORT).show();
}
}).create(); // 通過 create() 創(chuàng)建AlertDialog對象
alertDialog.show(); // 通過 show() 展示對話框
}
}
然后為 Activity 編寫一個布局文件,其中放置一個 Button 用于觸發(fā)對話框,如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="MainActivity">
<Button
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="彈出普通 AlertDialog"
android:id="@+id/alert" />
</RelativeLayout>
編譯之后點擊屏幕中間的 Button,彈出來的就是一個普通對話框了。我們設置了“確定”、“取消”、“中立” 3 個Button,分別表示“確定”、“取消”以及“退出對話框” 3 種操作,實際使用中,可以在回調(diào)接口里針對 3 種 Button 設置不同的回調(diào)邏輯,效果如下:
3.3 單選對話框
單選對話框在普通對話框的基礎之上增加一個用戶的輸入,顧名思義,我們可以給用戶提供一些選項讓用戶勾選,然后在點擊“確定”之后獲取到用戶的選擇。
通過setSingleChoiceItems
方法設置一個字符串數(shù)組作為單選項,然后通過DialogInterface.OnClickListener
接口監(jiān)聽用戶的選擇操作。
package com.emercy.myapplication;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
final String[] hero_road = new String[] { "對抗路", "打野", "中路", "發(fā)育路", "輔助" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.alert).setOnClickListener(this);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog alert = builder
.setIcon(R.drawable.warning)
.setTitle("選擇你要走的峽谷分路")
.setSingleChoiceItems(hero_road, 0,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"我要玩" + hero_road[which], Toast.LENGTH_SHORT).show();
}
}).create();
alert.show();
}
}
效果如下:
3.4 多選對話框
布局文件保持不變,只需要修改點擊事件即可。通過setMultiChoiceItems()
接口設置一個多選列表,在用戶選擇的時候系統(tǒng)會回調(diào)onClick()
方法,在其中可以記錄下用戶的選擇,代碼如下:
package com.emercy.myapplication;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
final String[] hero_road = new String[] { "對抗路", "打野", "中路", "發(fā)育路", "輔助" };
private boolean[] checked = new boolean[hero_road.length];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.alert).setOnClickListener(this);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog alert = builder
.setIcon(R.drawable.warning)
.setTitle("選擇你擅長的峽谷分路")
.setMultiChoiceItems(hero_road, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
checked[which] = isChecked;
}
}).setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("“");
for (int i = 0; i < hero_road.length; i++) {
if (checked[i]) {
stringBuilder.append(hero_road[i]);
stringBuilder.append(",");
}
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
stringBuilder.append("”");
Toast.makeText(MainActivity.this, "我擅長" + stringBuilder, Toast.LENGTH_SHORT).show();
}
}).create();
alert.show();
}
}
效果如下:
3.5 列表對話框
使用列表對話框會彈出一個選擇列表,用戶可以從列表中選擇一個并直接關(guān)閉對話框,設置列表采用setItems()
接口:
package com.emercy.myapplication;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
final String[] hero_road = new String[] { "對抗路", "打野", "中路", "發(fā)育路", "輔助" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.alert).setOnClickListener(this);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog alert = builder
.setIcon(R.drawable.warning)
.setTitle("選擇你要走的峽谷分路")
.setItems(hero_road, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),"我要走" + hero_road[which], Toast.LENGTH_SHORT).show();
}
}).create();
alert.show();
}
}
效果如圖:
4. 小結(jié)
AlertDialog 相比前兩節(jié)學到的 Toast 和 Notification 而言,它會直接擋住用戶的界面,等待用戶主動關(guān)閉,是一個比較強的通知方式。因此在使用的時候一定要慎重,不要使用的太頻繁而對用戶造成過度的打擾。AlertDialog 不但可以給用戶通知,還能輕易的接收用戶的選擇,互動性比較強。它的創(chuàng)建方法通常是采用構(gòu)建者模式,通過 AlertDialog.Builder 類來定制它的樣式及內(nèi)容,根據(jù)樣式的不同常用的有“普通對話框”、“單選對話框”、“多選對話框”以及“列表對話框”,在設置完成之后通過create()
創(chuàng)建 AlertDialog,最終通過show()
完成展示。這種通過 Builder 來構(gòu)建的方式在 Android 中非常常用,你學會了嗎?