Snackbar使用及其注意事项(转)
http://blog.csdn.net/jywangkeep_/article/details/46405301
Snackbar使用及其注意事项
引言
Snackbar是Android Support Design Library库支持的一个控件,具体的使用配置可以查看:Android Support Design Library配置指南,这篇文章说明了配置过程,以及可能遇到的问题,主要是跟NavigationLibrary开源库的冲突问题。
基本使用
Snackbar使用的时候需要一个控件容器用来容纳Snackbar.官方推荐使用CoordinatorLayout这个另一个Android Support Design Library库支持的控件容纳。因为使用这个控件,可以保证Snackbar可以让用户通过向右滑动退出。
因此写布局(activity_snackbar_test.xml)如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:onClick="createSnackbar"
android:text="@string/snackbar_test_button_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
然后在Activity中获取CoordinateorLayout作为容器,然后调用Snackbar.make(Container, "SnackbarTest", Snackbar.LENGTH_LONG).show();就可以生成一个Snackbar了,具体Activity的代码如下:
/**
* Activity for {@link android.support.design.widget.Snackbar}'s test.
*
* @author JYwang
* @email jywangkeep@163.com
*/
public class SnackbarTestActivity extends Activity {
CoordinatorLayout container;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_snackbar_test);
container = (CoordinatorLayout) findViewById(R.id.container);
}
public void createSnackbar(View v) {
Snackbar.make(container, "SnackbarTest", Snackbar.LENGTH_LONG).show();
}
}
效果图如下:
由于Snackbar是支持添加一个按钮的,因此Snackbar的构造语句可以写成这样:
Snackbar.make(container, "SnackbarTest",Snackbar.LENGTH_LONG).setAction("Action", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(container,"ActionClick",Snackbar.LENGTH_LONG).show();
}
}).show();
点击按钮之后的效果图如下所示:
从图中可以看到,右边出现了一个Action字样的按钮,如果点击之后会出现下面的结果:
到这里基本的Snackbar就可以使用了,可以用它显示需要显示的短消息,甚至是添加一个交互按钮,并且为其添加点击事件监听。
但是如何设置Snackbar的消息文字的颜色以及Action文字的颜色呢?
外观设置
对于Action可以通过Snack的bar的公开APIsnackbar.setActionTextColor(int color)设置,但是使用的时候不太好用,但是没有找到设置消息文字颜色的API,但是在查看Snackbar.class的时候找到了一个方法:
public View getView() {
return this.mView;
}
当去查看setActionTextColor(int color)的时候,发现了这个方法也被调用了,用于获取Snackbar的用于显示Action的TextView实例。继续查看,可以发现,每一个Snackbar的内容通过其内部类SnackbarLayout来呈现,其具体声明如下:
public static class SnackbarLayout extends LinearLayout
而在Snackbar(ViewGroup parent)这个包级声明的方法中发现上面的getView()返回的mView就是SnackbarLayout实例,这个类的布局最终是layout_snackbar_include.xml,这个是Android Support Design Library库中的布局文件,具体内容如下:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/snackbar_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="@dimen/snackbar_padding_vertical"
android:paddingBottom="@dimen/snackbar_padding_vertical"
android:paddingLeft="@dimen/snackbar_padding_horizontal"
android:paddingRight="@dimen/snackbar_padding_horizontal"
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
android:maxLines="@integer/snackbar_text_max_lines"
android:layout_gravity="center_vertical|left|start"
android:ellipsize="end"/>
<TextView
android:id="@+id/snackbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/snackbar_extra_spacing_horizontal"
android:layout_marginStart="@dimen/snackbar_extra_spacing_horizontal"
android:layout_gravity="center_vertical|right|end"
android:background="?attr/selectableItemBackground"
android:paddingTop="@dimen/snackbar_padding_vertical"
android:paddingBottom="@dimen/snackbar_padding_vertical"
android:paddingLeft="@dimen/snackbar_padding_horizontal"
android:paddingRight="@dimen/snackbar_padding_horizontal"
android:visibility="gone"
android:textAppearance="@style/TextAppearance.Design.Snackbar.Action"/>
</merge>
其实到这里,剩下的问题就可以很快解决了。从上面可以看出来,具体Snackbar的内容就是布局中的两个TextView,因此只要能够获取这两个个TextView实例,那么修改属性就非常简单了。而上面的getView()则解决了上面这个问题,因此可以写下面的帮助方法实现设置消息文本的颜色。
public static void setSnackbarMessageTextColor(Snackbar snackbar, int color) {
View view = snackbar.getView();
((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(color);
}
使用下面的代码使用:
Snackbar snackbar =
Snackbar.make(container, "SnackbarTest", Snackbar.LENGTH_LONG).setAction("Action", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar snackbar =
Snackbar.make(container, "ActionClick", Snackbar.LENGTH_LONG);
setSnackbarMessageTextColor(snackbar,Color.parseColor("#FF0000"));
snackbar.show();
}
});
setSnackbarMessageTextColor(snackbar, Color.parseColor("#FFFFFF"));
snackbar.show();
点击按钮之后的结果如下图:
点击Action显示的结果如下图:
修改Action文本颜色同上,当然如果你愿意使用官方的API也可以。
内存问题
Google官方说这个是个轻量级的控件,比Toast交互性更好一些,但是比Dialog更轻量级,确实也是如此。但是自己在使用的时候,出现了内存方面的一个问题。
比如上面的例子中,我连续点击按钮,会不断生成Snackbar实例,这个时候内存是不断增加的,以恒定的数量增加,结果下图所示:
从图中的曲线可以看出,有一段时间内存不断增长,我测试的时候每点一次,就会有0.01MB的内存增长,虽然后面会有垃圾回收,这个回收比较快是因为我使用的模拟器问题,允许的上限较小,如果实际情况中使用真机,会在增长到上M的内存之后才会出现内存回收,当然其他地方及早出现GC另说。
因此,如果应用的内存需求比较紧张,建议还是使用其他方法解决这个问题,我尝试服用一个Snackbar实例实现,但是要么不是显示不正常或者动画效果不理想,因此使用System.gc()主动进行垃圾回收。
但是并不是每一次生成Snackbar的时候都进行GC,而是设置了一个GC次数上限,具体代码如下:
private int messageShowCount = 0;
private int gcCount = 5;
private void count() {
messageShowCount++;
if (messageShowCount >= gcCount) {
System.gc();
messageShowCount = 0;
}
}
然后在每次生成Snackbar的时候调用这个方法就行,具体效果如下:
从图中可以看出来,内存很平稳,基本上。当然上面的具体数量可以自己设置,还有因为System.gc()太频繁可能会造成应用卡顿,具体情况下可以自己斟酌使用,上面的也只是我自己的解决方案而已。
最后,Keep calm and profile it.
Snackbar使用及其注意事项(转)的更多相关文章
- 总结一下现在关于Design Support Library的几个博客
原文转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0713/3179.html 关于Design Support Libr ...
- FloatingActionButtonDemo【悬浮按钮的使用,顺带snackBar的使用】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 FloatingActionButton简称FAB. 一. 对于App或某个页面中是否要使用FloatingActionButton ...
- SnackbarUtilDemo【Snackbar的封装类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个工具类参考的是<没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南>,代码几乎一 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- app开发外包注意事项,2017最新资讯
我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...
- favicon.ioc使用以及注意事项
1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...
- ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
随机推荐
- 抢红包算法 java
抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...
- 浙大 pat 1007题解
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- MySQL索引入门
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. ...
- UVA 562 Dividing coins (01背包)
//平分硬币问题 //对sum/2进行01背包,sum-2*dp[sum/2] #include <iostream> #include <cstring> #include ...
- Linux下好用的简单实用命令
1.你是否为在输入了一大串命令之后发现第一个字符打错了而苦恼?只能删除重来嘛?或者一步步左移光标? NO,一个组合键轻松搞定 Ctrl+A -----到命令行首 Ctrl+E ------到命令行末 ...
- 隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat
此处是转载的 是给自己做的备注 问题:隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat 原因查找:由于tomcat自身log中并无错误产生,磁盘空间足够,读写也正常 ...
- 从MySQL全库备份中恢复某个库和某张表【转】
从MySQL全库备份中恢复某个库和某张表 一.全库备份-A [root@mha2 backup]#mysqldump -uroot -p123456 --default-character-set=u ...
- MySQL 多表查询分页
SELECT v.*, vt.id vid, vt.vote_id, vt. option, vt.poll FROM vote v JOIN vote_option vt ON v.id = vt. ...
- C# 中的局部static变量
其实这问题没什么可讨论的,C#不支持局部静态变量. 但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法. C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如 ...
- wmts调用路径手工合成
wmts调用路径手工合成 一般OGC WMTS地图只提供了xml描述,地图应用常常要合成WMTS完整的调用URL.我们需要获知以下参数: BaseURL:例如 "http://10.36.5 ...