Dialog和Toast苗沧,大家一定非常熟悉刊棕,常常被用來(lái)作為Android應(yīng)用內(nèi)提示性信息的兩種展示方式。然而Google在Design包中又提供了一種新的選擇待逞,那就是Snackbar甥角。這三種提示框到底有什么區(qū)別呢,使用時(shí)到底該如何選擇呢识樱?不妨跟著本文一起學(xué)習(xí)一下吧嗤无。
Dialog
模態(tài)對(duì)話框。也就說(shuō)怜庸,此刻該對(duì)話框中的內(nèi)容獲取了焦點(diǎn)当犯,想要操作對(duì)話框以外的功能,必須先對(duì)該對(duì)話框進(jìn)行響應(yīng)休雌。
借助AlertDialog
類可以快速實(shí)現(xiàn)一個(gè)Dialog的展示,注意Android中的AlertDialog
采用了建造者模式
肝断,代碼如下:
public void onClickDialog(View v){
new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("This is message")
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create()
.show();
}
效果如圖:
需要注意的是杈曲,不同版本的系統(tǒng)下,android.app.AlertDialog
包中的AlertDialog展示樣式不太一樣胸懈。上圖是在6.0系統(tǒng)下展示的效果担扑,屬于MD風(fēng)格樣式。我們?cè)倏匆幌翧ndroid 4.4.4系統(tǒng)的默認(rèn)樣式:
是不是很丑趣钱,大家可以自己嘗試涌献,在更低版本中,系統(tǒng)Dialog的默認(rèn)樣式更丑首有!不過(guò)值得慶幸的是燕垃,在V7包中枢劝,有AlertDialog的兼容版!大家在使用的時(shí)候可以使用android.support.v7.app.AlertDialog
卜壕,這樣您旁,就能夠在不同的版本中統(tǒng)一使用MD風(fēng)格下的默認(rèn)樣式的Dialog,就像圖一展示的那樣轴捎。
補(bǔ)充一點(diǎn)鹤盒,在Android 5.0也就是Android L之后,Button的默認(rèn)樣式會(huì)導(dǎo)致英文字母大寫侦副,我們可以通過(guò)設(shè)置android:textAllCaps="false"
屬性來(lái)處理這個(gè)問題侦锯。對(duì)于AlertDialog,可以操作Theme樣式秦驯,但有一點(diǎn)需要注意尺碰,就是在values
文件夾theme中設(shè)置的時(shí)候不能直接使用這個(gè)屬性,會(huì)導(dǎo)致版本兼容問題汇竭,只要去掉android:
命名空間即可葱蝗,如:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/blue</item>
<item name="colorPrimaryDark">@color/blue_dark</item>
<item name="colorAccent">@color/red</item>
<item name="textAllCaps">false</item>
</style>
Toast
非模態(tài)提示框。也就說(shuō)提示框的顯示并不影響我們對(duì)其他地方的操作细燎,Toast無(wú)法手動(dòng)控制隱藏两曼,需要設(shè)置Toast的顯示時(shí)長(zhǎng),一旦顯示時(shí)間結(jié)束玻驻,Toast會(huì)自動(dòng)消失悼凑。代碼如下:
public void onClickToast(View v){
Toast.makeText(this, "This is a Toast", Toast.LENGTH_SHORT).show();
}
顯示效果如圖:
Toast的使用也有一個(gè)需要注意的地方,由于Toast是非模態(tài)的璧瞬,如果多次點(diǎn)擊并顯示Toast户辫,就會(huì)出現(xiàn)Toast重復(fù)創(chuàng)建并顯示,給用戶造成一種Toast長(zhǎng)時(shí)間不隱藏的幻覺嗤锉,如圖:
顯然渔欢,這種現(xiàn)象非常影響用戶體驗(yàn),為了解決這種問題瘟忱,我們可以對(duì)Toast的顯示做一個(gè)封裝奥额,使用Static全局變量,建一個(gè)ToastUtils工具類访诱,始終使用一個(gè)Toast顯示信息垫挨,代碼如下:
public class ToastUtils {
private static Toast toast;
public static void showToast(Context context, String message) {
if (toast == null) {
toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
toast.setText(message);
}
toast.show();
}
}
封裝之后,Toast顯示時(shí)長(zhǎng)始終是我們?cè)O(shè)置的Toast.LENGTH_SHORT
或Toast.LENGTH_LONG
触菜,如圖:
Snackbar
Snackbar是Design包中提出的一種介于Dialog和Toast之間的新控件九榔。我們先來(lái)看一下它的使用代碼:
public void onClickSnackbar(View v){
Snackbar.make(this.findViewById(android.R.id.content), "This is a Snackbar", Snackbar.LENGTH_SHORT)
.setAction("Cancel", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
}
可以看出,Snackbar的使用與Toast特別像,唯獨(dú)多了個(gè)setAction
方法哲泊。這里需要說(shuō)明一下make
方法的第一個(gè)參數(shù)剩蟀,是一個(gè)View對(duì)象,先看一下源碼介紹:
Snackbar will try and find a parent view to hold Snackbar's view from the value given* to {@code view}. Snackbar will walk up the view tree trying to find a suitable parent,* which is defined as a {@link CoordinatorLayout} or the window decor's content view,* whichever comes first.
也就是說(shuō)攻旦,Snackbar將從這個(gè)View參數(shù)找出當(dāng)前窗口最外層視圖喻旷,然后在其底部顯示。所以牢屋,如果當(dāng)前是Activity且预,這個(gè)View可以是Activity中的任何一個(gè)元素,也可以像上面示例代碼中那樣烙无,直接使用Activity的ContentView锋谐。Snackbar顯示效果如圖:
相比Toast,Snackbar多了個(gè)可操作的按鈕截酷,并為其設(shè)置文本內(nèi)容和監(jiān)聽事件涮拗,用于手動(dòng)控制彈框的隱藏。當(dāng)然迂苛,也可以不設(shè)置按鈕三热,這種情況,Snackbar只能在到達(dá)顯示時(shí)長(zhǎng)后自動(dòng)隱藏三幻,如圖:
小結(jié)
Dialog就漾,Snackbar,Toast都可以作為應(yīng)用內(nèi)的一種提示框來(lái)使用念搬,但從各自的特性來(lái)看抑堡,三者所表現(xiàn)出來(lái)的重要性為:Dialog > Snackbar > Toast 。所以朗徊,不同的應(yīng)用場(chǎng)景下首妖,選擇一個(gè)合適的方式來(lái)顯示提示性信息,對(duì)于提升用戶體驗(yàn)來(lái)說(shuō)爷恳,也是非常重要的有缆。
對(duì)于刪除確認(rèn)、版本更新等重要性提示信息温亲,需要用戶做出選擇的情況下棚壁,使用Dialog;
對(duì)于無(wú)網(wǎng)絡(luò)提示铸豁、刪除成功灌曙、發(fā)布操作完成等這類不重要的提示性信息菊碟,使用Toast节芥;
介于二者之間的其它情況,不妨使用Snackbar,給用戶一個(gè)多重選擇也許會(huì)是一個(gè)不錯(cuò)的方式头镊。
參考鏈接:
http://blog.csdn.net/guolin_blog/article/details/51336415
示例源碼
我在GitHub上建立了一個(gè)Repository蚣驼,用來(lái)存放整個(gè)Android Material Design系列控件的學(xué)習(xí)案例,會(huì)伴隨著文章逐漸更新完善相艇,歡迎大家補(bǔ)充交流颖杏,Star地址: