你真的瞭解Dialog、Toast和Snackbar嗎?

Dialog和Toast全部人確定都不會陌生的,這個咱們平時用的實在是太多了。而Snackbar是Design Support庫中提供的新控件,有些朋友可能已經用過了,有些朋友可能還沒去了解。可是你真的知道何時應該使用Dialog,何時應該使用 Toast,何時應該使用Snackbar嗎?本篇文章中咱們就來學習一下這三者使用的時機,另外還會介紹一些額外的技巧。android

1. Dialog

首先來介紹一下Dialog的用法吧,其實很簡單,相信大多數人都是常用的:app

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了,以下圖所示:
ide

如今這個Dialog是Material Design風格的,由於我是在6.0系統上運行的,所以會自動賦予這樣的風格。可是若是在老版本系統上運行,好比說2.3系統,會是什麼樣的效果呢?運行一下就知道了,以下圖所示:
佈局

額。。這個效果就比較醜了,不過沒辦法,這就是2.3系統當時的風格呀。學習

人的審美老是在進步的,咱們有沒有什麼辦法在老版本的系統中也使用Material Design風格的Dialog呢?固然有,Google已經充分考慮到了這一點,在appcompat-v7庫中也提供了一個AlertDialog類,完整路徑是:gradle

android.support.v7.app.AlertDialog

 

咱們使用這個包中的AlertDialog,就能讓對話框在全部的系統版本中都保持一致的風格了。如今在2.3系統中從新運行一下,效果以下所示:
動畫

能夠看到,如今的效果就比較不錯了,這也算是一個小技巧吧。ui

Dialog的做用是給用戶一個提示信息,並讓用戶根據提示作出判斷。而Dialog的特徵就是,它會阻止你本來正在進行的操做,必須中止下來對 Dialog進行處理。可是,大多數的人可能並不喜歡這樣被打斷,也許用戶正在處理一項重要的操做,忽然彈出一個Dialog遮擋住了他本來的操做,這個 時候用戶會變得很惱火。this

所以,使用Dialog的時候仍是謹慎一點比較好,儘可能不要給用戶帶來糟糕的體驗感。spa

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可能會是你最好的選擇。
相關文章
相關標籤/搜索