你真的了解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可能会是你最好的选择。
相关文章
相关标签/搜索