轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/51336415
本文同步發表於我的微信公衆號,掃一掃文章底部的二維碼或在微信搜索 郭霖 即可關注,每天都有文章更新。
今天給大家帶來一篇簡單易懂的微技巧文章,並沒有什麼高深的技術點,但重點仍然是在細節,相信還是可以給不少朋友帶來幫助的。
Dialog和Toast所有人肯定都不會陌生的,這個我們平時用的實在是太多了。而Snackbar是Design Support庫中提供的新控件,有些朋友可能已經用過了,有些朋友可能還沒去了解。但是你真的知道什麼時候應該使用Dialog,什麼時候應該使用Toast,什麼時候應該使用Snackbar嗎?本篇文章中我們就來學習一下這三者使用的時機,另外還會介紹一些額外的技巧。
1. Dialog
首先來介紹一下Dialog的用法吧,其實很簡單,相信大多數人都是經常使用的:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
.setMessage("Dialog content.")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
})
.show();
這段代碼就可以彈出一個非常精美的Dialog了,如下圖所示:
現在這個Dialog是Material Design風格的,因爲我是在6.0系統上運行的,因此會自動賦予這樣的風格。但是如果在老版本系統上運行,比如說2.3系統,會是什麼樣的效果呢?運行一下就知道了,如下圖所示:
額。。這個效果就比較醜了,不過沒辦法,這就是2.3系統當時的風格呀。
人的審美總是在進步的,我們有沒有什麼辦法在老版本的系統中也使用Material Design風格的Dialog呢?當然有,Google已經充分考慮到了這一點,在appcompat-v7庫中也提供了一個AlertDialog類,完整路徑是:
android.support.v7.app.AlertDialog
我們使用這個包中的AlertDialog,就能讓對話框在所有的系統版本中都保持一致的風格了。現在在2.3系統中重新運行一下,效果如下所示:
可以看到,現在的效果就比較不錯了,這也算是一個小技巧吧。
Dialog的作用是給用戶一個提示信息,並讓用戶根據提示做出判斷。而Dialog的特徵就是,它會阻止你原本正在進行的操作,必須停止下來對Dialog進行處理。但是,大多數的人可能並不喜歡這樣被打斷,也許用戶正在處理一項重要的操作,突然彈出一個Dialog遮擋住了他原本的操作,這個時候用戶會變得很惱火。
因此,使用Dialog的時候還是謹慎一點比較好,儘量不要給用戶帶來糟糕的體驗感。
2. Toast
說到不會阻擋用戶原本正在進行的操作,這就延伸到我們今天的第二個主題,Toast。Toast只會彈出一段信息,告訴用戶某某事情已經發生了,過一段時間後就會自動消失。它完全不會阻擋用戶的任何操作,甚至用戶也可以完全不用理會Toast。
那麼我們還是先來看一下Toast的基本用法吧,如下所示:
Toast.makeText(context, "things happened", Toast.LENGTH_SHORT).show();
最後一個參數用於指定Toast顯示的時長,Toast.LENGTH_SHORT表示顯示時間較短,Toast.LENGTH_LONG表示顯示時間較長。
不過也不是說Toast的用法就一點深度都沒有了,比如說上述的寫法就會存在如下圖所示的問題:
可以看到,這裏我快速連續點擊了五次按鈕,Toast就觸發了五次。這樣的體驗其實是不好的,因爲也許用戶是手抖了一下多點了幾次,導致Toast就長時間關閉不掉了。又或者我們其實已在進行其他操作了,應該彈出新的Toast提示,而上一個Toast卻還沒顯示結束。
因此,最佳的做法是將Toast的調用封裝成一個接口,寫在一個公共的類當中,如下所示:
public class Util {
private static Toast toast;
public static void showToast(Context context,
String content) {
if (toast == null) {
toast = Toast.makeText(context,
content,
Toast.LENGTH_SHORT);
} else {
toast.setText(content);
}
toast.show();
}
}
可以看到,這裏和我們平時使用Toast的方式並不一樣,這裏會先判斷Toast對象是否爲空,如果是空的情況下才會調用makeText()方法來去生成一個Toast對象,否則就直接調用setText()方法來設置顯示的內容,最後再調用show()方法將Toast顯示出來。由於不會每次調用的時候都生成新的Toast對象,因此剛纔我們遇到的問題在這裏就不會出現了。
調用的時候也很簡單,只需要把Context對象和Toast要顯示的內容傳進來就可以了:
Util.showToast(context, "things happened");
現在我們再重新運行一遍程序,效果如下圖所示:
可以看到,現在不管我們觸發多少次Toast調用,都只會持續一次Toast顯示的時長,這也算是一個小技巧吧。
Toast的作用是告訴用戶現在發生了什麼事情,不會阻擋用戶的操作,但同時用戶只能被動接收這個事情,因爲沒有什麼辦法來讓用戶是選擇同意還是拒絕。
雖說Toast在用戶體驗方面要比Dialog好一些,但是也要慎用,尤其是涉及到一些敏感操作的時候。比如說刪除數據,只給用戶一個提示:“你的數據已被刪除”,而不給用戶選擇是否要刪除的機會,這個時候用戶可能就要暴走了。
3. Snackbar
如果說Dialog和Toast是兩個極端的話,那麼Snackbar就是處於中間的位置了。Snackbar和Toast比較相似,但是用途更加廣泛,並且它是可以和用戶進行交互的。Snackbar使用一個動畫效果從屏幕的底部彈出來,過一段時間後也會自動消失。
在使用Snackbar之前,首先需要在app/build.gradle中添加相應的依賴:
dependencies {
compile 'com.android.support:design:23.4.0'
}
然後就可以使用Snackbar了,它的用法和Toast是比較相似的:
Snackbar.make(view, "data deleted",Snackbar.LENGTH_LONG)
.setAction("Undo", new View.OnClickListener(){
@Override
public void onClick(View v) {
}
})
.show();
這裏調用Snackbar的make()方法來創建一個Snackbar對象,make()方法的第一個參數需要傳入一個view,只要是當前界面佈局的任意一個view都可以,Snackbar會使用這個view來自動查找最外層的佈局,用於展示Snackbar。第二個參數就是Snackbar中顯示的內容,第三個參數是Snackbar顯示的時長。這些和Toast都是類似的。
接着這裏又調用了一個setAction()方法來設置一個動作,從而讓Snackbar不僅僅是一個提示,而是可以和用戶進行交互的。最後調用show()方法讓Snackbar顯示出來。
現在重新運行一下程序,效果如下圖所示:
可以看到,Snackbar的效果有點類似於Toast,不過它是從屏幕底部彈出來的。另外Snackbar上面可以加入和用戶交互的按鈕,比如刪除數據的時候給用戶一個Undo的選項,從這些小的細節方面都可以提升很多的用戶體驗。
4. 總結
現在你有三種方式可以給用戶提示信息,Dialog、Toast和Snackbar,下面我們對這三種方式的使用時機做個總結吧。
- Dialog:當提示信息是至關重要的,並且必須要由用戶做出決定才能繼續的時候,使用Dialog。
- Toast:當提示信息只是告知用戶某個事情發生了,用戶不需要對這個事情做出響應的時候,使用Toast。
- Snackbar:以上兩者之外的任何其他場景,Snackbar可能會是你最好的選擇。
關注我的技術公衆號,每天都有優質技術文章推送。關注我的娛樂公衆號,工作、學習累了的時候放鬆一下自己。
微信掃一掃下方二維碼即可關注: