快使用Snackbar!——Android Snackbar花式使用指南

 

本文是在《Design Support Library第三部分:Snackbar样式》和《Snackbar使用及其注意事项》两篇文章的启发下而来,首先对两篇文章的作者表示感谢。

Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用。本文对原生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();





4.SnackbarUtil

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


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



整出幺蛾子的使用示例:

 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

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


关于Toast的花式使用请看我写的Android Toast花式使用



作者:简名
链接:https://www.jianshu.com/p/cd1e80e64311
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/62772.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

y的花式写法_y的花式写法_26个字母的花式写法,总有一个你喜欢哒

一千零一夜|第五百七十九夜 简书 一张叶小绘 哈喽大家好&#xff0c;我是随身携带一只笔、随时练字的手帐er叶小绘(*^ω^*) 好久不见哇&#xff0c;因为这次整理了26个字母的书写idea&#xff0c;在忙碌的工作、满当当的网课进修的时间间隙创作&#xff0c;断断续续花了好几天的…

python3花式秀操作--文件读写

0x01 输出重定向文件 with open("test.txt","wt") as f:print("nihao",filef) 0x02 一句话写文件 [open("test.txt","at").write(str(i)"\n") for i in range(10)] - 解析&#xff1a; 此种方法需要用采用追加…

ArcGIS出图时如何制作花式边框

喜欢就关注我们吧&#xff01; 制图时候我们的边框一般是简单的实线边框。 如何给我们的图加上一些花式边框呢&#xff1f; 01 视频教学 ArcGIS制作花式边框 需要花式边框就可以留言哦&#xff01; 推荐学习 ArcGIS在国土空间城乡规划中的实战应用 ArcGIS之模型构建器&#x…

计算机系学霸情书,拿最高得分写最动人的话,学霸才是情书界高端玩家!

文丨超人妈妈 很多网友说在现在的网络时代&#xff0c;千兆时代&#xff0c;爱情也被加了千兆、万兆的速度&#xff0c;那种车马很慢&#xff0c;一生只够爱一个人的情感&#xff0c;对当代人来说就像是乌托邦一般的存在。 对于很多大学生而言&#xff0c;在对异性表达感情是还…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

小程序 this.getOpenerEventChannel is not a function

小程序新出功能&#xff0c;页面跳转后通过事件的发布订阅&#xff0c;实现页面间数据的传递&#xff0c;但我在使用过程中发现个大bug 官方文档 https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html this.getOpenerEventChannel is not a functi…

uni-app打包成微信小程序后再开发运行时微信开发者工具没反应

前端小白的uni-app框架的艰难学习之路 问题 打包过的uni-app项目&#xff0c;想要继续开发&#xff0c;却发现一直都提示编译完成&#xff0c;而微信开发者工具也没有反应&#xff0c;不像未打包之前保存即刷新&#xff0c;这个问题我困扰了许久&#xff0c;后来终于发现了问…

【微信小程序】运行机制和更新机制

&#x1f352;观众老爷们好呀&#xff0c;牛牛又更文了&#xff0c;上文我们对部分比较常用的组件进行了讲解&#xff0c;作为开发者&#xff0c;我们还需要对小程序的运行机制和更新机制做一定的了解&#xff0c;那问题来了&#xff0c;你对它们了解多少呢&#xff1f; &#…

小程序进入页面控制台报wx.openChannelsUserProfile is not a function

今天拉取代码发现有冲突,内容还挺多,懒得修改,直接删掉重新下载. 冲突是解决了,进入首页发现报wx.openChannelsUserProfile is not a function,小程序是能正常使用的. 网友大佬说是调试库版本低于2.10.x 地址 :https://blog.csdn.net/fqfq123456/article/details/119633765 我…

hb运行到微信小程序出现报错:[微信小程序开发者工具] ? Enable IDE Service (y/N) 

背景&#xff1a; 换了台电脑&#xff0c;发现hb运行到微信小程序的时候出错了 18:09:17.800 [微信小程序开发者工具] ? Enable IDE Service (y/N) [27D[27C 18:09:17.803 [微信小程序开发者工具] - initialize 18:09:17.803 [微信小程序开发者工具] 18:09:17.807 [微信小程…

uniapp微信小程序运行成功但是没调用微信开发者工具

先看运行里面的运行设置&#xff0c;开发者本地的地址是否是好的 然后看微信开发者工具里面的设置&#xff0c;找到安全设置&#xff0c;打开服务端口&#xff0c;这样工具就可以被命令行和http调用了

从uni-app运行到微信开发者工具小程序后没有自动打开项目的原因

今天从uni-app运行程序到微信开发者工具却没有自动将项目进行打开的原因&#xff1a; 是uni-app端的微信小程序的AppID与微信开发者工具的不一致导致的没有打开。 所以我们一定要两边的AppID是一致的才行。 去网页查看自己的AppID 微信开发工具的AppID 打开我们文件里面的ma…

微信小程序之停止录音

今日继续在第二大学远程实习&#xff0c;上次分享了微信小程序的录音&#xff0c;录音有开始也肯定有停止&#xff0c;分享一下停止录音的实现。 在我们实际应用开发中可能还会遇到小程序视频、录音、直播冲突的情况&#xff0c;或者录音过程中来了电话被中断录音等情况&#…

微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】

今天在开发一个小功能&#xff0c;copy了之前写的代码&#xff0c;但是在实现功能时&#xff0c;出现了如下问题&#xff1a; 先在这简单总结一下解决方案&#xff1a; 在调用方法时&#xff0c;在" "中前后多加了空格&#xff1b;在 js 中没有定义该方法&#xff1…

运行微信小程序出现的问题

1.问题一&#xff1a;用Hbuilder工具运行后&#xff0c;能跳到微信开发者工具界面&#xff0c;但是小程序项目打不开。 解决&#xff1a;第一步检查以下这些插件是否安装好。 第二布检查manifest.json的微信小程序配置的AppID是否配置好。 第三步检查服务端口是否打开了。 …

微信小程序运行及更新机制

微信小程序运行及更新机制 1、微信小程序运行机制1.1 前台和后台1.2 小程序启动&#xff1a;冷启动和热启动1.3 小程序销毁 2、微信小程序更新机制2.1 启动时同步更新定期检查发现版本更新用户长时间未使用小程序 2.2 启动时异步更新开发者手动触发更新 2.3 小程序管理后台的相…

微信小程序之---使用微信开发者工具调试小程序 debug 失效 以及 console.log 无法输出

项目场景&#xff1a; 使用 HbuilderX 开发微信小程序,在调试的过程中,使用了 debug 以及 console.log ,在 H5 中输出测试都是可以的,但是运行到微信开发者工具之后, console.log 无法生效,在查阅相关解决办法之后,都没有解决 问题描述 在此之前有尝试过一些解决方案,如清除缓…

什么才是好的商业计划书呢?

不同行业的商业计划书有所不同&#xff0c;同一行业由于项目的差异&#xff0c;使得商业计划书也有所不同。什么才是好的商业计划书呢&#xff1f;一言以概之&#xff0c;能让投资者心服口服拿出钱的商业计划书就是好的商业计划书。虽然商业计划书的写法有多种&#xff0c;格式…

一份好的商业计划书该怎么写

一、商业计划书是创业者找VC/PE的敲门砖 •据统计投资人平均每天收到50-100份BP&#xff0c;而只有5-8份会受到重视 •投资人阅读每份商业计划书平均时间为3分44秒 •商业计划书平均长度19.2页&#xff0c;建议不超过20页 •商业计划书撰写建议使用PPT&#xff08;节省投资人时…

商业计划书中该如何做产品介绍?

在商业计划书中&#xff0c;投资人关心的问题之一就是&#xff0c;风险企业的产品、技术或服务能否以及在多大程度上解决现实生活中的问题&#xff0c;或者&#xff0c;风险企业的服务及产品能否帮助顾客节约开支&#xff0c;增加收入。因此&#xff0c;产品介绍是商业计划书中…