SnackBar的使用及封装
这篇博客是学习完 Android 6.0 的新控件 SnackBar 后所写。如有不妥之处,欢迎留言,谢谢~
SnackBar 的简述
Snackbar 是 Android Support Design Library 库中的一个控件。
优势:
- 通常在屏幕底部快速弹出消息(位置取决于容纳 SnackBar 控件的位置)
- 比 Toast 更加好用
- 比 Dialog 更轻量级
- 可与用户进行简单的交互
- 可滑动删除
SnackBar 的基本使用
在使用 SnackBar 之前,需要导入 com.android.support:design
库:
PS:需要一个控件容器来容纳 SnackBar 。Google 推荐使用 CoordinatorLayout 来作为 SnackBar 的容器。在 SnackBar 的源码中是这样解释的:
CoordinatorLayout 也是 Android Support Design Library 库中的一个控件。CoordinatorLayout 使用新的思路通过协调调度子布局的形式实现触摸影响布局的形式产生动画效果。其有两个功能: 作为顶层布局;调度协调子布局。
最简单的 SnackBar 使用方式与 Toast 十分相似。
- 图例:
- 使用方式:1234567/*** 用于创建SnackBar* @param view 容纳SnackBar的父容器* @param text 显示在左边的Message* @param duration 持续时间:Snackbar.LENGTH_SHORT或LENGTH_LONG*/Snackbar.make(View view,CharSequence text,int duration).show(); // 显示
右侧还有按钮的 SnackBar
- 图例:
- 使用方式:12345678910111213Snackbar.make(View view,CharSequence text,int duration)/*** 设置 SnackBar 右侧的按钮* @param text 按钮名字* @param listener 点击监听事件*/.setAction(CharSequence text,new View.OnClickListener(){public void onClick(View v) {// 点击 SnackBar 右侧按钮后的逻辑}}).show(); // 显示
若想在 SnackBar 出现或消失时,做其他逻辑,可以使用其Callback方法
1234567891011121314Snackbar.make(View view,CharSequence text,int duration).setCallback(new Snackbar.Callback() {public void onDismissed(Snackbar snackbar, int event) {super.onDismissed(snackbar, event);// 消失时}public void onShown(Snackbar snackbar) {super.onShown(snackbar);// 出现时}}).show(); // 显示
SnackBar 的颜色改造
在使用 SnackBar 过程中,会发现 SnackBar 和 Toast 都是样式过于单一。然而开发过程中,对不同的信息往往需要使用不同的颜色进行区分,引起用户的注意。Android 只提供了修改 Action 文字颜色的方法setActionTextColor()
,显然是不够的。那么只能我们自己阅读源码后,自行添加了。
阅读源码后,有所发现:
SnackBar 中定义了一个内部类
SnackbarLayout
,且这个内部类是继承LinearLayout
的;SnackbarLayout 中加载了
R.layout.design_layout_snackbar_include
,那意味着 SnackBar 的布局时是有 SnackbarLayout 决定的。R.layout.design_layout_snackbar_include
布局文件的代码:1234567891011121314151617181920212223242526272829303132<?xml version="1.0" encoding="utf-8"?><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="1"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" // 注意到没? 当设置了SnackBar有按钮时才会显示android:textColor="?attr/colorAccent"style="?attr/borderlessButtonStyle"/></merge>
了解到这个后,设置消息和 SnackBar 的背景颜色就是很简单了。
SnackBar 的布局改造
Google 在 Material Design 设计规范中提到:当有2个或者2个以上的操作出现时,应该使用提示框而不是 Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非 Snackbar。
但有时候我们接到的需求是要在 SnackBar 添加其他布局,怎么办呢?(我很想遵循官方的设计规范,但却因生活压力被迫接受那些奇葩的需求)
这个时候,我们应该想到刚刚提到的,SnackBar 的布局是由 SnackbarLayout 决定的。那我们可以直接新建一个布局,然后添加进去就可以了嘛。
使用示例:
新建一个布局文件:(直接一个ImageView,并设置为默认图标)
Java文件中运用:
运行后示例:
SnackBar 封装
为了更方便、灵活的使用 SnackBar,对 SnackBar 进行封装。
项目地址
SnackBar 的使用教程到此结束。
参考博文:
没时间解释了,快使用Snackbar
作者简介:
刘广明(@cnLGMing),一步一步往上爬。
文章若有不对之处,欢迎指正,谢谢~
版权声明:原创作品,转载时请务必注明原始出处。