Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用。本文对原生Snackbar进行了修改,使其更加灵活。

主要:

1、Snackbar基本使用

2、多彩Snackbar-----------------------对应源码中SnackbarLayout中加载了R.layout.design_layout_snackbar_include布局文件中,有个是TextView,一个是Button,可见TextView是左侧的文本

3、在Snackbar中添加图标----------------------Snackbar的view是由SnackbarLayout实现的,而SnackbarLayout是继承自LinearLayout,所以新添加一个布局

4、封装了Snackbar工具类***

1.Snackbar基本介绍

使用Snackbar要导入com.android.support:design库

Snackbar显示在所有屏幕其它元素之上(屏幕最顶层),同一时间只能显示一个snackbar。

Snackbar的基本使用很简单,与Toast类似。

Snackbar.make(view, message_text, duration).setAction(action_text, click_listener).show();

make()方法是生成Snackbar的。Snackbar需要一个控件容器view用来容纳,官方推荐使用CoordinatorLayout来确保Snackbar和其他组件的交互,比如滑动取消Snackbar、Snackbar出现时FloatingActionButton上移。显示时间duration有三种类型LENGTH_SHORT、LENGTH_LONG和LENGTH_INDEFINITE。

setAction()方法可设置Snackbar右侧按钮,增加进行交互事件。如果不使用setAction()则只显示左侧message。

Snackbar.make(coordinatorLayout,"这是massage", Snackbar.LENGTH_LONG).setAction("这是action", new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this,"你点击了action",Toast.LENGTH_SHORT).show();}}).show();

下面这张图演示了上面代码所实现的效果:Snackbar长显示、点击Action弹出toast提示以及Snackbar在CoordinatorLayout中滑动取消。

基础演示.gif

如果你想在Snackbar的显示时或消失时做些什么,可以调用Snackbar的setCallback()方法。

2.多彩Snackbar

Snackbar和Toast的默认样式都很单一,但是有时我们希望把不同类型信息区别显示,从而使用户更容易注意到提示信息。所以使Snackbar变色是一个好主意。

Snackbar的官方API只提供了setActionTextColor()这个方法修改Action的文字颜色,这怎么办?查源码吧,哪里不会点哪里。(><)

在源码中我们看到Snackbar中定义了一个继承自LinearLayout的内部类SnackbarLayout,Snackbar的样子就是由这个SnackbarLayout实现的。

SnackbarLayout中加载了R.layout.design_layout_snackbar_include布局文件,打开后看到下面这段代码(我把padding、margin的具体数值也打了出来):

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextViewandroid:id="@+id/snackbar_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:paddingTop="14dp"android:paddingBottom="14dp"android:paddingLeft="12dp"android:paddingRight="12dp"android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"android:maxLines="2"android:layout_gravity="center_vertical|left|start"android:ellipsize="end"android:textAlignment="viewStart"/><Buttonandroid:id="@+id/snackbar_action"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="0dp"android:layout_marginStart="0dp"android:layout_gravity="center_vertical|right|end"android:paddingTop="14dp"android:paddingBottom="14dp"android:paddingLeft="12dp"android:paddingRight="12dp"android:visibility="gone"android:textColor="?attr/colorAccent"style="?attr/borderlessButtonStyle"/>
</merge>

由命名可知,以snackbar_text为名的TextView就是Snackbar左侧的message。

好了,我们开始修改Snackbar的背景颜色和message字体颜色吧。

public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {View view = snackbar.getView();//获取Snackbar的viewif(view!=null){view.setBackgroundColor(backgroundColor);//修改view的背景色((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);//获取Snackbar的message控件,修改字体颜色}
}

很简单,没有几行代码。

本文最后提供的Snackbar封装类代码中定义了4种不同类型的信息:Info(妹子向你发来一条消息)、Confirm(妹子已收到你发出的消息)、Warning(妹子删除了你发出的消息)、Alert(妹子已将你拉黑),分别用蓝色、绿色、橙色、红色来表示。

消息信息.png

警告和错误信息演示.gif

3.在Snackbar中增加图标

短文本

通常 Snackbar 的高度应该仅仅用于容纳所有的文本,而文本应该与执行的操作相关。Snackbar 中不能包含图标,操作只能以文本的形式存在。

最多0-1个操作,不包含取消按钮

当一个动作发生的时候,应当符合提示框和可用性规则。当有2个或者2个以上的操作出现时,应该使用提示框而不是 Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非 Snackbar。

上面这段是谷歌 Material Design设计规范中的话。

但是我就是想在Snackbar中加图标增加趣味性,引起用户注意怎么办?我就是想在Snackbar中放两个按钮进行可选非必要操作怎么办?我就是想整幺蛾子。︿( ̄︶ ̄)︿

设计规范中的说法是有道理的,因为官方认为“Snackbar是一种针对操作的轻量级反馈机制”,做的麻烦了影响视觉感受。但是对于上述任性的开发者(或者是接了奇葩需求的苦逼开发者)我们也有解决方法。

前面我们提到过Snackbar的view是由SnackbarLayout实现的,而SnackbarLayout是继承自LinearLayout,那么我们新建一个布局添加进去不就行了么。(~o ̄ ̄)~o...

public static void SnackbarAddView(Snackbar snackbar,int layoutId,int index) {View snackbarview = snackbar.getView();//获取snackbar的View(其实就是SnackbarLayout)Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;//将获取的View转换成SnackbarLayoutView add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);//加载布局文件新建ViewLinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);//设置新建布局参数p.gravity= Gravity.CENTER_VERTICAL;//设置新建布局在Snackbar内垂直居中显示snackbarLayout.addView(add_view,index,p);//将新建布局添加进snackbarLayout相应位置
}

上面的代码中,如果我们不设置向Snackbar中添加的布局文件的布局参数,新布局会显示在Snackbar内的顶部。使用上述任性方法的时候要注意新加布局的大小和Snackbar内文字长度,Snackbar过大或过于花哨了可不好看。

下面是使用示例。我们先新建一个布局,暂时命名为snackbar_addview.xml,简单的放进了一个ImageView,图片就是android默认图标。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
>
<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:src="@mipmap/ic_launcher"/>
</LinearLayout>

然后在activity中写下snackbar的设置:

 Snackbar snackbar= Snackbar.make(coordinatorLayout,"这是massage", Snackbar.LENGTH_LONG);SnackbarUtil.setSnackbarColor(snackbar,SnackbarUtil.blue);
SnackbarUtil.SnackbarAddView(snackbar,R.layout.snackbar_addview,0);snackbar.show();

添加图标演示.gif

4.SnackbarUtil

我将我常用的Snackbar相关设置封装成了一个类,大家可以根据自己的需求使用。

/*** Created by 赵晨璞 on 2016/5/1.*/
public class SnackbarUtil {public static final   int Info = 1;
public static final  int Confirm = 2;
public static final  int Warning = 3;
public static final  int Alert = 4;public static  int red = 0xfff44336;
public static  int green = 0xff4caf50;
public static  int blue = 0xff2195f3;
public static  int orange = 0xffffc107;/*** 短显示Snackbar,自定义颜色* @param view* @param message* @param messageColor* @param backgroundColor* @return*/
public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);setSnackbarColor(snackbar,messageColor,backgroundColor);return snackbar;
}/*** 长显示Snackbar,自定义颜色* @param view* @param message* @param messageColor* @param backgroundColor* @return*/
public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);setSnackbarColor(snackbar,messageColor,backgroundColor);return snackbar;
}/*** 自定义时常显示Snackbar,自定义颜色* @param view* @param message* @param messageColor* @param backgroundColor* @return*/
public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int messageColor, int backgroundColor){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);setSnackbarColor(snackbar,messageColor,backgroundColor);return snackbar;
}/*** 短显示Snackbar,可选预设类型* @param view* @param message* @param type* @return*/
public static Snackbar ShortSnackbar(View view, String message, int type){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);switchType(snackbar,type);return snackbar;
}/*** 长显示Snackbar,可选预设类型* @param view* @param message* @param type* @return*/
public static Snackbar LongSnackbar(View view, String message,int type){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);switchType(snackbar,type);return snackbar;
}/*** 自定义时常显示Snackbar,可选预设类型* @param view* @param message* @param type* @return*/
public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int type){Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);switchType(snackbar,type);return snackbar;
}//选择预设类型
private static void switchType(Snackbar snackbar,int type){switch (type){case Info:setSnackbarColor(snackbar,blue);break;case Confirm:setSnackbarColor(snackbar,green);break;case Warning:setSnackbarColor(snackbar,orange);break;case Alert:setSnackbarColor(snackbar,Color.YELLOW,red);break;}
}/*** 设置Snackbar背景颜色* @param snackbar* @param backgroundColor*/
public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) {View view = snackbar.getView();if(view!=null){view.setBackgroundColor(backgroundColor);}
}/*** 设置Snackbar文字和背景颜色* @param snackbar* @param messageColor* @param backgroundColor*/
public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {View view = snackbar.getView();if(view!=null){view.setBackgroundColor(backgroundColor);((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);}
}/*** 向Snackbar中添加view* @param snackbar* @param layoutId* @param index 新加布局在Snackbar中的位置*/
public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) {View snackbarview = snackbar.getView();Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);p.gravity= Gravity.CENTER_VERTICAL;snackbarLayout.addView(add_view,index,p);
}}

简单的使用示例:

SnackbarUtil.ShortSnackbar(coordinator,"妹子向你发来一条消息",SnackbarUtil.Info).show();

消息演示.gif

整出幺蛾子的使用示例:

//一般

coordinator在activity中用view

 Snackbar snackbar= SnackbarUtil.ShortSnackbar(coordinator,"妹子删了你发出的消息",SnackbarUtil.Warning).setActionTextColor(Color.RED).setAction("再次发送", new View.OnClickListener() {@Overridepublic void onClick(View v) {SnackbarUtil.LongSnackbar(coordinator,"妹子已将你拉黑",SnackbarUtil.Alert).setActionTextColor(Color.WHITE).show();}});SnackbarUtil.SnackbarAddView(snackbar,R.layout.snackbar_addview,0);SnackbarUtil.SnackbarAddView(snackbar,R.layout.snackbar_addview2,2);snackbar.show();

这个示例中调用了两次SnackbarAddView()方法向Snackbar中添加了两个不同的自定义布局,效果如下(不建议大家这么玩 _(:з」∠)_ ):

添加多布局.gif

暂时就是这些。[]~( ̄ ̄)~*

Android Snackbar花式使用指南相关推荐

  1. 适用于Android的OpenSL ES指南-OpenSL ES的Android扩展

    翻译自Android Extensions 针对Android的OpenSL ES扩展了参考OpenSL ES规范,使其与Android兼容,并利用Android平台的强大功能和灵活性. Androi ...

  2. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南

    这篇文档旨在帮助 Android 开发者利用既有的 Android 知识来通过 Flutter 开发移动应用.如果你了解 Android 框架的基本知识,你就可以使用这篇文档作为 Flutter 开发 ...

  3. Android 开发工程师面试指南

    原文链接:https://github.com/GeniusVJR/LearningNotes <Android 开发工程师面试指南 LearningNotes >,作者是知乎Androi ...

  4. Android开发工程师面试指南

     Android开发工程师面试指南 功能介绍     给Android开发工程师的一份面试指南,包含面试题集与简历模板. 面试题集 面试题集里的答案大部分来源于我的博客,因此这个题集也相当于是我的博客 ...

  5. 转 android anr 分析示例,[摘]Android ANR日志分析指南之实例解析

    前文<[摘]Android ANR日志分析指南>也摘抄了如何分析,接下来通过实例解析. 一.主线程被其他线程lock,导致死锁 waiting on <0x1cd570> (a ...

  6. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南

    戳我查看 DEMO Bugly Android热更新使用指南 官方文档 视频教程 第一步:添加插件依赖 工程根目录下"build.gradle"文件中添加: buildscript ...

  7. Android SELinux开发入门指南之如何增加Native Binder Service权限

      Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...

  8. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题

      Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...

  9. Android SELinux开发入门指南之如何增加Java Binder Service权限

      Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...

最新文章

  1. 重构当当网交易系统!
  2. 网络推广中移动端优化如何在细节中取胜?
  3. PHP 找出数值数组中不重复最大的10个数和最小的10个数
  4. 内网穿透和内网映射区别是什么?
  5. Visual Studio Code 里针对 SAP Commerce Cloud Impex 文件的语法高亮扩展
  6. CentOS 7 搭建 LAMP
  7. 微处理器:50岁了!
  8. ×××保障再上层楼:侠诺×××备援实例
  9. 上汽集团减发员工绩效工资75% 时效长度3到6个月
  10. hadoop之 hadoop 机架感知
  11. 4、vueJs基础知识04
  12. 九型人格在招聘中的应用策略
  13. 三十二个vbs整蛊代码,好玩到没朋友
  14. 微信小程序生成海报功能
  15. 设计心理学之色彩心理学和马斯洛需求层次理论
  16. PS青山绿水婚片处理
  17. Buy and Resell HDU - 6438 贪心
  18. WPF 海康威视网络摄像头回调方式实现断连提示,降低时延
  19. 计算机应用 审稿2个月,我的《计算机应用》投稿经历
  20. 日志分析管理系统ELK+redis+filebeat搭建

热门文章

  1. Opencv中的GrabCut图像分割
  2. 【组合数学】第二类斯特林数
  3. ASP.NET中使用JObject和JArray解析Json数据 (实用、赞)
  4. 运动蓝牙耳机哪个品牌好,2022运动蓝牙耳机推荐
  5. “val_loss“ KeyError: Failed to format this callback filepath
  6. Arduino米思齐Mixly---声音检测控制灯
  7. 纯前端将网页导出pdf文件
  8. 关于C#.NET中PerformanceCounter无法从系统备份存储中重建性能计数器设置,错误代码为 5的问题解决
  9. Java成员变量(全局变量)和局部变量
  10. python声明一个全局变量_全局变量声明Python