Google在2015 I/O大会上,给我们带来了更加详细的Material Design规范,同时也引入了Android Design Support Library,为我们提供了基于Material设计规范的控件。它兼容性广,能兼容到android 2.1(按Google官方数据,兼容android 2.3以上即可覆盖当前市面上所有Android设备),并且高度封装,使用简洁,可谓业界良心之作。

与Dialog及Toast的异同

在与用户的交互过程中,有时我们需要给用户一些提示信息,甚至可能提供一些操作的选择。通常,我们会使用Dialog或Toast来进行这种提示。这两种提示各有特点,但却似乎都在各自的特点上走了极端。

Dialog的特点是,它弹出来的时候会中断用户当前的操作,直到这个Dialog被处理。它除了向用户提供一些信息之外,也可能包含一些操作,通常用于必须打断用户的提示,比如当用户进行清空数据等重要操作时进行二次确认的提示。

Toast则是走了另外一个极端。它用于向用户提供少量的信息展示,并且不会中断用户当前的操作,这样在与用户的交互过程中也不会显得唐突。但它也只能用于展示少量信息,不能向用户提供一些操作选择。

而在Android Design Support Library中,谷歌为我们引入了Snackbar,它使用简单,与Toast相似,并且吸收了Dialog与Toast各自的优点,而避免了它们设计上的不足。它在界面的底部向用户展示少量信息,并且可以向用户提供一种轻量级的反馈操作,如下图:



在这个例子中,原先对于未验证的车牌是点击后直接跳到车牌列表的界面并提示去验证,但显然提示用户未验证并给出“去验证”的操作建议会更加友好。

快速使用

Snackbar的使用很简单,接口与Toast相似。像上面的图中的例子,代码如下:

Snackbar.make(view, "需要验证该车牌才能使用该功能", Snackbar.LENGTH_LONG)
.setAction("去验证", new View.OnClickListener() {
@Override
public void onClick(View view) {
Activities.to(getActivity(), VehicleListActivity.class);
}
}).show();

接口介绍

Snackbar向我们提供了以下相关的接口:

  • static Snackbar make(View view, int resId, int duration)static Snackbar make(View view, CharSequence text, int duration):用于创建一个Snackbar,参数如下:

    • view:用于找到合适的parent的view,以把自己添加上去
    • resIdtext:展示的信息
    • duration:展示的时间,参数值如下:
      • LENGTH_LONG 显示2750毫秒
      • LENGTH_SHORT 显示1500毫秒
      • LENGTH_INDEFINITE 一直展示,直到它被dismiss掉,或者是下一个Snackbar被显示时。
  • setText(int resId)setText(CharSequence message):更新Snackbar上的提示消息。
  • setAction(int resId, View.OnClickListener listener)setAction(CharSequence text, View.OnClickListener listener):设置显示到Snackbar上的操作。
  • setActionTextColor(ColorStateList colors)setActionTextColor(int color):设置操作的文本颜色。
  • setDuration(int duration)getDuration():设置及获取显示的时间
  • show()dismiss()isShown():显示、隐藏Snackbar,以及判断当前Snackbar是否正在被显示。
  • setCallback(Snackbar.Callback callback):设置当前Snackbar可见性变化时的回调

Snackbar提供的接口非常简单并且易于理解,需要注意的是,与Toast不同,当新的Snackbar被显示时,会先隐藏掉上一个Snackbar然后显示新的Snackbar,而不像Toast那样等前面的Toast显示完毕才显示。

一些技巧

设置消息的文本颜色

Snackbar并没有提供设置消息文本颜色的API。通过定位到它的布局代码,我们可以看到它是通过一个style来配置:

android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"

该style对应源码:

  <style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance">
<item name="android:textSize">@dimen/design_snackbar_text_size</item>
<item name="android:textColor">?android:textColorPrimary</item>
</style>

可见其颜色读的是theme中的android:textColorPrimary的值。但是如果我们想要修改它的颜色的话,配置android:textColorPrimary是无效的,我们要配置的是theme里面的android:textColor

然后可能有一个问题,通常我们会在theme里使用这个属性为整个应用配置默认的文本颜色,比如在我公司的项目里,就使用#333来作业默认的黑色文本,这样就使得Snackbar的提示消息看不见(Snackbar的背景色是#ff303030)。这种情况下只能使用比较hack的方式来修改它的颜色值了。我试过覆盖它的style定义,但是未能成功。最后是通过getView()接口获取到SnackbarLayout,再拿到里面的TextView来修改其文本颜色,代码如下:

((TextView)snackbar.getView().findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.WHITE);

滑动删除的Snackbar

当Snackbar与CoordinatorLayout一起使用时,即Snackbar显示在CoordinatorLayout里面时,可以通过在Snackbar上右滑的操作把当前的Snackbar隐藏掉,即我们在调用Snackbar.make(…)方法时,传入的View应该为CoordinatorLayout或CoordinatorLayout的子view。

另外Snackbar与FloatingActionButton如果都在CoordinatorLayout内时,Snackbar展示时FloatingActionButton会跟着上移,而不会出现互相遮挡的情况。

Android Design Support Library使用详解——Snackbar的更多相关文章

  1. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

  2. Android Design Support Library使用详解——TextInputLayout与TextInputEditText

    TextInputLayout 在谷歌的Material Design中,文本输入是这样表现的:当用户点击输入框想要输入文字时,如果输入框是空的,那么它的提示文字(hint)就会变小并且同时移动到输入 ...

  3. Android Design Support Library初探,NavigationView实践

    前言 在前几天的IO大会上,Google带来了Android M,同时还有Android支持库的新一轮更新,其中更是增加一个全新的支持库Android Design Support Library,包 ...

  4. Android Design Support Library(三)用CoordinatorLayout实现Toolbar隐藏和折叠

    此文的代码在Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果代码的基础上进行修改,如果你没有看过本系列的第一篇文章最好先看一看.Co ...

  5. Android开发学习之路-Android Design Support Library使用(CoordinatorLayout的使用)

    效果图: 上面的这个图有两个效果是,一个是顶部的图片,在上滑之后会隐藏起来并且显示出一个ToolBar(ToolBar类似于ActionBar,但是只有ToolBar是兼容Material Desig ...

  6. 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

    转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...

  7. Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

    原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fanc ...

  8. Codelab for Android Design Support Library used in I/O Rewind Bangkok session

    At the moment I believe that there is no any Android Developer who doesn't know about Material Desig ...

  9. Android Design Support Library: 学习CoordinatorLayout

    简述 CoordinatorLayout字面意思是"协调器布局",它是Design Support Library中提供的一个超级帧布局,帮助我们实现Material Design ...

随机推荐

  1. Java-NIO(七):阻塞IO与非阻塞IO

    阻塞IO 传统的 IO 流都是阻塞式的. 也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因此,在完成网络通信 ...

  2. Struts(十一):OGNL表达式(二)

    Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...

  3. requests-证书验证

    import requests #response = requests.get('https://www.12306.cn') #print(response.status_code) #以上会显示 ...

  4. python制作一个简单的中奖系统

    注释: 展示图下的代码,我是用pycharm写的,是python解释器中的一种,本课没不同解释器的要求,可根据自己喜欢的解释器编写. 步骤: 本期给大家带来的是,一个简单的中奖系统,首先打开自己电脑上 ...

  5. python 元组(tuple)的使用方法介绍

    一.元组定义 元组和列表类似,元组使用的是小括号,列表是中括号,但是元组不像列表那样可以增删改:如果列表中存在列表或字符串,那么可以对其进行修改. 创建一个元组,只需要括号中添加元素,元素用逗号隔开即 ...

  6. IIS7 http自动跳转到https

    1.下载安装URL重写模块:Microsoft URL Rewrite Module 32位:http://download.microsoft.com/download/4/9/C/49CD28DB ...

  7. [ABP]浅谈工作单元 在整个 ABP 框架当中的应用

    ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...

  8. [HNOI 2018]排列

    Description 题库链接 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le ai \le n\) ,以及 \(n\) 个整数 \(w_1, w_2, \do ...

  9. [ZJOI 2013]丽洁体

    Description 题库链接 给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多 ...

  10. [Codeforces 297E]Mystic Carvings

    Description 题库链接 题面链接 Solution 这里给出主席树的版本.主席树维护直线的一个端点在前 \(i\) 个端点中,另一个端点在区间内的个数. Code //It is made ...