比系统自带的更好用的 SnackBar

3,197 阅读3分钟
原文链接: www.jianshu.com

关于SnackBar我相信不用我多说,我相信大部分的同学肯定都知道。他是在Android5.0之后才推出的,可以为一个操作提供了一个轻量级的反馈,用来代替Toast的。如果有不太了解的同学或者还不太清楚可以直接定位到 这篇文章 的Snackbar去看看。

对于SnackBar我们通常是这样使用的,

 Snackbar.make(mDrawerLayout,"再按一次退出",Snackbar.LENGTH_SHORT).show();

他的展示效果比较单一,就只有一个黑色的背景。我们能不能每一种类型的提示都有不同的样式呢,答案是:肯定可以。
下面我就来简单介绍下今天要介绍的这个关于SnackBar的扩展,其实这个扩展我也参考了一些博客,发现一些博客只提供了方法,没有具体的去封装,还有一些的确封装了,但是个人感觉提供的Api不太好用,于是决定自己再去做一下。


来看看最后的效果图。

关于这个扩展的使用,和原始api基本一致,但比原生的更好用。
先来看看怎么使用。

  • 不带Action的
    SnackBarUtils.makeShort(v, "TEXT").show();
    SnackBarUtils.makeShort(v, "TEXT").danger();
    SnackBarUtils.makeShort(v, "TEXT").confirm();
    SnackBarUtils.makeShort(v, "TEXT").info();
    SnackBarUtils.makeShort(v, "TEXT").warning();
  • 带有Action的
    SnackBarUtils.makeShort(v, "TEXT").info("action", new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          SnackBarUtils.makeShort(v, "TEXT").show();
                      }
                  });

是不是很简洁,也很方便! 如果你想让Snackbar显示的时间稍微长一点,可以调用SnackBarUtils.makeLong()方法,使用方法与上面一样。

其实代码的实现很简单,全部代码也没没到100行。(ps:在做这个封装的时候,我刚开始想过用构造者模式,最后在实现的时候发现不仅api使用不方便,还有点杀鸡用宰牛刀的感觉)。好了下面来看看代码实现。

/**
 * Created by _SOLID
 * Date:2016/5/9
 * Time:11:30
 */
public class SnackBarUtils {
    private static final int color_danger = 0xffa94442;
    private static final int color_success = 0xff3c763d;
    private static final int color_info = 0xff31708f;
    private static final int color_warning = 0xff8a6d3b;

    private static final int action_color = 0xffCDC5BF;

    private Snackbar mSnackbar;

    private SnackBarUtils(Snackbar snackbar) {
        mSnackbar = snackbar;
    }

    public static SnackBarUtils makeShort(View view, String text) {
        Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_SHORT);
        return new SnackBarUtils(snackbar);
    }

    public static SnackBarUtils makeLong(View view, String text) {
        Snackbar snackbar = Snackbar.make(view, text, Snackbar.LENGTH_LONG);
        return new SnackBarUtils(snackbar);
    }

    private View getSnackBarLayout(Snackbar snackbar) {
        if (snackbar != null) {
            return snackbar.getView();
        }
        return null;

    }


    private Snackbar setSnackBarBackColor(int colorId) {
        View snackBarView = getSnackBarLayout(mSnackbar);
        if (snackBarView != null) {
            snackBarView.setBackgroundColor(colorId);
        }
        return mSnackbar;
    }

    public void info() {
        setSnackBarBackColor(color_info);
        show();
    }

    public void info(String actionText, View.OnClickListener listener) {
        setSnackBarBackColor(color_info);
        show(actionText, listener);
    }

    public void warning() {
        setSnackBarBackColor(color_warning);
        show();
    }

    public void warning(String actionText, View.OnClickListener listener) {
        setSnackBarBackColor(color_warning);
        show(actionText, listener);
    }

    public void danger() {
        setSnackBarBackColor(color_danger);
        show();
    }

    public void danger(String actionText, View.OnClickListener listener) {
        setSnackBarBackColor(color_danger);
        show(actionText, listener);
    }

    public void confirm() {
        setSnackBarBackColor(color_success);
        show();
    }

    public void confirm(String actionText, View.OnClickListener listener) {
        setSnackBarBackColor(color_success);
        show(actionText, listener);
    }

    public void show() {
        mSnackbar.show();
    }

    public void show(String actionText, View.OnClickListener listener) {
        mSnackbar.setActionTextColor(action_color);
        mSnackbar.setAction(actionText, listener).show();
    }
}

如果感觉好用可直接拿走。因为相对而言比较简单,所以代码里面就没给注释了。我相信正在阅读的你肯定能看懂,真看不懂的可留言。如果感觉字体颜色不太搭,可以修改代码为每一种样式提供一种字体颜色,或者如果感觉api不够用,还可以为这个扩展类带来更多的灵活的api。

参考文章: