http://blog.csdn.net/jywangkeep_/article/details/46405301

Snackbar使用及其注意事项

引言

SnackbarAndroid 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使用及其注意事项(转)的更多相关文章

  1. 总结一下现在关于Design Support Library的几个博客

    原文转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0713/3179.html 关于Design Support Libr ...

  2. FloatingActionButtonDemo【悬浮按钮的使用,顺带snackBar的使用】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 FloatingActionButton简称FAB. 一. 对于App或某个页面中是否要使用FloatingActionButton ...

  3. SnackbarUtilDemo【Snackbar的封装类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个工具类参考的是<没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南>,代码几乎一 ...

  4. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  5. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  6. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  7. app开发外包注意事项,2017最新资讯

    我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...

  8. favicon.ioc使用以及注意事项

    1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...

  9. ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

随机推荐

  1. Paint on a Wall

    Paint on a Wall 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4012 搜索+状态压缩 这题刚开始以为是dp(之前写过墙是一 ...

  2. jQuery第十一章

    第十一章 一.jQuery性能优化 1.使用最新版本的jQuery类库. 2.使用合适的选择器 (1)$(“#id”) :使用id来定位DOM元素是最佳提高性能的方式. (2)$(“p”) :标签选择 ...

  3. 常见编程语言对REPL支持情况小结[转]

    文章转载自http://www.nowamagic.net/librarys/veda/detail/2462 最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”. ...

  4. 转:Delphi中destroy, free, freeAndNil, release用法和区别

    http://blog.sina.com.cn/s/blog_44fa172f0101cur1.html 1)destroy:虚方法 释放内存,在Tobject中声明为virtual,通常是在其子类中 ...

  5. OMCS开发手册(04) -- 二次开发流程

    在掌握了前面几篇关于OMCS的详细介绍后,我们就可以正式基于OMCS进行二次开发了.下面我们就从服务端和客户端的角度分别介绍开发的步骤. 一.服务端开发 抛开具体的业务逻辑而言,就OMCS的服务端的开 ...

  6. php 备份数据库

    <?php    header("Content-type:text/html;charset=utf-8");    //配置信息  $cfg_dbhost = 'loca ...

  7. SharePoint2013基于Form(FBA)的AD认证登陆

    来源于:http://www.haogongju.net/art/1964313 1. 使用SharePoint2013实现基于AD的Form认证,首先创建一个Web Application,步骤如下 ...

  8. php学习的第8天

    晚上老师布置啦17题算数问题的作业 我一看 感觉挺容易的 动手就开始做啦起来 不知不觉也9点多啊 终于做好前部题目 发现这我3个月前也遇到类似的题目 那是我还一题都做一题用上1个钟左右 好多也做不出 ...

  9. 简单的JDBC连接oracle数据库例子

    java连接Oracle数据库 JDBC(Java Data Base Connectivity,java数据库连接),那么我们该如何用java进行数据库的连接呢. import java.sql.C ...

  10. Activity LauchMode启动模式(转载)

    转载于:http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 在一个Android应用中,不可避免的会包含多个Activ ...