Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件,用来代替 Toast ,Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也可以处理用户交互(点击)事件。

Snackbar的特点如下:

  • Snackbar会在超时或者用户在屏幕其他地方触摸之后自动消失
  • 可以在屏幕上滑动关闭
  • 出现时不会阻碍用户在屏幕上的输入
  • 不支持输入
  • 屏幕上同时最多只能显示一个Snackbar
  • 如果在屏幕上有一个Snackbar的情况下再显示一个Snackbar,则先将当前显示的Snackbar隐藏后再显示新的Snackbar
  • 可以在Snackbar中添加一个或多个按钮,处理用户点击事件
  • Snackbar一般需要Coordinatorlayout来作为容器盛放,CoordinatorLayout保证Snackbar可以右滑推出

首先,使用MD包中的控件,都需要先在gradle文件中导入依赖:

compile 'com.android.support:design:25.0.0'

1、弹出Snackbar:

弹出Snackbar的方式是调用Snackbar类中的静态方法make(),返回一个Snackbar对象:

Snackbar simple_snackbar = Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE);
simple_snackbar.show();

make()方法的第一个参数是Snackbar的容器对象,一般是一个CoordinatorLayout对象;

第二个参数是Snackbar中想要显示的内容,一般只能显示2行;

第三个参数是Snackbar想要显示的时间长短,有三个值:LENGTH_INDEFINITE 永远显示、LENGTH_LONG显示较长时间、LENGTH_SHORT 显示较短时间;

Snackbar也要像Toast一样,调用show()方法才能显示。

2、添加按钮:

除了显示之外,Snackbar中还可以有一个按钮,我们称之为Action,它显示在Snackbar的右边,可以通过Snackbar对象的setAction()方法设置:

    Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
.setAction("Action1", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(container, "Action1 Clicked......", Snackbar.LENGTH_SHORT).show();
}
}).show();

可以看出来,setAction()方法中的第一个参数是按钮显示的文本;

第二个参数是点击按钮触发的事件。

3、添加显示/隐藏回调:

在Snackbar弹出和消失时,都会触发一个回调事件,我们可以通过Snackbar对象的setCallback()方法捕获它们:

    Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
Toast.makeText(MainActivity.this, "Snackbar隐藏", Toast.LENGTH_SHORT).show();
} @Override
public void onShown(Snackbar snackbar) {
Toast.makeText(MainActivity.this, "Snackbar显示", Toast.LENGTH_SHORT).show();
}
});

Snackbar.Callback中有两个抽象方法,onDismissed()方法是当Snackbar消失的时候触发的事件;onShown()方法是当Snackbar显示的时候触发的事件。

4、动态设置属性:

Snackbar支持动态的设置一些属性,如Action的文本颜色、显示的文本内容、显示的持续时间等等:

    // 使用Snackbar的API中的方法设置Action按钮的文本颜色
simple_snackbar.setActionTextColor(Color.GREEN);
// 动态的为Snackbar设置文本
simple_snackbar.setText("这是新的文本");
// 设置Snackbar显示的时间为一个具体的值
simple_snackbar.setDuration(5000);

其他的如显示文本的颜色、背景颜色等需要通过Snackbar对象的getView()方法获取View之后,通过View找到各个控件后才能进行属性的设置:

    // 获取Snackbar中显示的View对象
View view = snackbar.getView();
// 找到Snackbar中的显示内容TextView并设置颜色
((TextView) view.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(textColor);
// 找到Snackbar中的Action按钮并设置文本颜色
((TextView) view.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(actionColor);
// 设置整个Snackbar的背景颜色
view.setBackgroundColor(bgColor);

到此为止,弹出的Snackbar的演示结果如下图所示:

5、向Snackbar中添加自定义View:

Android为我们提供的Snackbar中最多只能显示一个Action,如果多次调用setAction()方法设置Action,结果将是显示最后一次添加的Action。我们要想添加更过的按钮或其他控件,就需要调用这样一个工具类:

/**
* Snackbar的工具类
* addViewToSnackbar()方法:当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
* setAction()方法:为Snackbar中新添加的按钮设置文本和点击事件
*/
public class SnackbarUtil {
/**
* 当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
*
* @param snackbar Snackbar对象
* @param layoutId 新的布局ID
* @param index 当index值为1时,将新布局添加到消息文本后面,action按钮前面
*/
public static void addViewToSnackbar(Snackbar snackbar, int layoutId, int index) {
// 获取snackbar的View(实就是SnackbarLayout)
View snackbarview = snackbar.getView();
// 将获取的View转换成SnackbarLayout
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbarview;
// 加载布局文件新建View
View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId, null);
// 设置新建布局参数
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
<span style="white-space:pre"> </span>LinearLayout.LayoutParams.WRAP_CONTENT);
// 设置新建布局在Snackbar内垂直居中显示
p.gravity = Gravity.CENTER_VERTICAL;
// 将新建布局添加进snackbarLayout相应位置
snackbarLayout.addView(add_view, index, p);
} /**
* 为Snackbar中新添加的按钮设置文本和点击事件
*
* @param snackbar Snackbar对象
* @param btn_id 新添加的按钮的ID
* @param action_string 新添加的按钮中展示的文本
* @param onClickListener 新添加的按钮的点击事件
*/
public static void setAction(Snackbar snackbar, int btn_id, String action_string, View.OnClickListener onClickListener) {
View view = snackbar.getView();//获取Snackbar的view
if (view != null) {
//为添加的按钮设置监听器
((Button) view.findViewById(btn_id)).setText(action_string);
(view.findViewById(btn_id)).setOnClickListener(onClickListener);
}
} /**
* 为Snackbar中新添加的ImageView设置展示的图片资源ID
*
* @param snackbar Snackbar对象
* @param iv_id ImageView的ID
* @param res_id 要在ImageView中展示的图片的资源ID
*/
public static void setImageAction(Snackbar snackbar, int iv_id, int res_id) {
View view = snackbar.getView();//获取Snackbar的view
if (view != null) {
//为添加的按钮设置监听器
((ImageView) view.findViewById(iv_id)).setImageResource(res_id);
}
}
}

然后,在代码中调用这个类中的addViewToSnackbar()和addAction()方法,就可以添加更过的View了:

    // 添加一个自定义按钮
SnackbarUtil.addViewToSnackbar(custom_snackbar, R.layout.sideworks_extrabtn, 1);
SnackbarUtil.setAction(custom_snackbar, R.id.extra_btn, "取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "取消删除", Toast.LENGTH_SHORT).show();
custom_snackbar.dismiss();
}
});

再多添加几个控件之后,运行结果如下图所示:

6、调整Snackbar显示的位置:

Android为我们提供的Snackbar默认是显示在屏幕的最底部,但是我们也可以自己定义Snackbar的显示位置,方法是设置Snackbar中View的LayoutParams,例如,我们想让Snackbar在父布局的中间显示,就可以这样写:

    // 设置Snackbar在CoordinatorLayout中居中显示
View snackbarView = center_snackbar.getView();
ViewGroup.LayoutParams lp = snackbarView.getLayoutParams();
CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(lp.width, lp.height);
params.gravity = Gravity.CENTER_VERTICAL;
snackbarView.setLayoutParams(params);

运行之后的结果如下图所示:

以上就是对Snackbar用法的简单介绍,下面贴出码云上的源码,供大家参考。

DEMO地址

【Android - 控件】之MD - Snackbar的使用的更多相关文章

  1. RxJava RxBinding RxView 控件事件 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  3. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  4. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  5. Android - 控件android:ems属性

    Android - 控件android:ems属性http://blog.csdn.net/caroline_wendy/article/details/41684255?utm_source=tui ...

  6. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...

  7. UIAutomator定位Android控件的方法

    UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...

  8. 从Android系统出发,分析Android控件构架

    从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ...

  9. Android控件系列之RadioButton&RadioGroup(转)

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  10. 第三个 android控件

    android控件以及控件对应的属性:

随机推荐

  1. [Next] Next.js+Nest.js实现GitHub第三方登录

    GitHub OAuth 第三方登录 第三方登录的关键知识点就是 OAuth2.0 . 第三方登录,实质就是 OAuth 授权 . OAuth 是一个开放标准,允许用户让第三方应用访问某一个网站的资源 ...

  2. mybatis-spring 启动过程和调用过程

    mybatis-spring 可以为我们做什么 mybatis框架已经很不错了,它把配置和执行sql的通用过程抽象出来.只要你符合mybatis框架的要求,首先有正确的配置,然后有model,inte ...

  3. Java IO编程——转换流

    所谓的转换流指的是可以实现字节流与字符流操作的功能转换,例如:进行输出的时候OutputStream需要将内容变为字节数组后才可以进行输出,而Writer可以直接输出字符串,这一点是方便的,所以很多人 ...

  4. 【翻译】Prometheus 2.12.0 新特性

    Prometheus 2.12.0 现在(2019.08.17)已经发布,在上个月的 2.11.0 之后又进行了一些修正和改进. 在当前的 6 周发布周期中,每一个 Prometheus 版本都有比较 ...

  5. [考试反思]0908NOIP模拟测试40:颠簸

    怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...

  6. NOIP模拟 13

    我终于又厚颜无耻地赖着没走 ...... T1 矩阵游戏 用了30hmin找规律,然后发现貌似具有交换律,然后发现貌似有通项公式,然后发现貌似每次操作对通项的影响是相同的,然后发现貌似跟N没啥关系.. ...

  7. Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页

    webbrowser- 方便的Web浏览器控制器,是Python一个模块,可实现自动打开关.定时打开关闭网页/刷新网页,在Unix下,图形浏览器在X11下更受欢迎,但如果图形浏览器不可用或X11显示器 ...

  8. Markdown基本语法小结

    目录 Typore Markdown基本语法 1.标题 一级标题 二级标题 三级标题 2.字体加粗 3.斜体 4.文本高亮 5.上标 6.下标 7.引用代码 1 8.代码引用2 9.代码引用3 10. ...

  9. 在控制器中如何对frxml的控件初始化

    如果在控制器中实现Initializable这个接口,并重iInitializable这个方法 对于一个fxml文件来说它首先执行控制器的构造函数,这个时候它是无法对@FXML修饰的方法进行访问的,然 ...

  10. Geometry 判断几何是否被另一个几何/线段分割成多段

    如下图,如何判断几何多边形A被多边形B,切割为多段几何? 几何A被几何B切割 1. 获取几何A与几何B的交集C var intersectGeometry = new CombinedGeometry ...