Android中Dialog、Toast和Snackbar使用場景以及技巧

前言:

Dialog和Toast用的太頻繁了,但是Snackbar是Design Support庫中提供的新控件,可能對於一些比較早寫Android的大神來說,用的相對較少,因爲可能老Android程序員看到一個Snackbar直接就用dialog或者Toast來寫出來了。這三個控件雖然部分功能都是提醒用戶,但是他們出現的場景與時機可能會嚴重影響到用戶體驗。我們來簡單描述一下:

1.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是Material Design風格的,因爲我是在6.0系統上運行的。而第二個是比較老的系統版本,比如說2.3系統!

那麼我們想兼容低版本的,就試用support-v7裏面的包就可以了:

android.support.v7.app.AlertDialog
那麼低版本的系統也會是Material Design風格的!
注意:Dialog的作用是給用戶一個提示信息,並讓用戶根據提示做出判斷。而Dialog的特徵就是,它會阻止你原本正在進行的操作,必須停止下來對Dialog進行處理。但是,大多數的人可能並不喜歡這樣被打斷,也許用戶正在處理一項重要的操作,突然彈出一個Dialog遮擋住了他原本的操作,這個時候用戶會變得很惱火。
因此,使用Dialog的時候還是謹慎一點比較好,儘量不要給用戶帶來糟糕的體驗感。


2.Toast
我們有時候稱他的諧音:吐司。

Toast.makeText(context, "things happened", Toast.LENGTH_SHORT).show();
吐司會在不打斷操作的情況下,給用戶提示,隨後會消失。
最後一個參數用於指定Toast顯示的時長,Toast.LENGTH_SHORT表示顯示時間較短,Toast.LENGTH_LONG表示顯示時間較長。

不知道大家有沒有遇到這種情況,就是點擊一個按鈕,然後彈出一個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對象,因此剛纔我們遇到的問題在這裏就不會出現了:
Util.showToast(context, "things happened");
雖說Toast在用戶體驗方面要比Dialog好一些,但是也要慎用,尤其是涉及到一些敏感操作的時候。比如說刪除數據,只給用戶一個提示:“你的數據已被刪除”,而不給用戶選擇是否要刪除的機會,這個時候用戶可能就要暴走了。

3.Snackbar
Snackbar和Toast比較相似,但是用途更加廣泛,並且它是可以和用戶進行交互的。Snackbar使用一個動畫效果從屏幕的底部彈出來,過一段時間後也會自動消失。

dependencies { compile 'com.android.support:design:23.4.0' }//<span style="font-size: 13.3333px;">添加依賴</span>
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的選項,從這些小的細節方面都可以提升很多的用戶體驗。

總結:

Dialog:當提示信息是至關重要的,並且必須要由用戶做出決定才能繼續的時候,使用Dialog。
Toast:當提示信息只是告知用戶某個事情發生了,用戶不需要對這個事情做出響應的時候,使用Toast。
Snackbar:以上兩者之外的任何其他場景,Snackbar可能會是你最好的選擇。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章