Android重要控件SnackBar使用方法详解
作者:Fndroid 发布时间:2022-11-10 04:49:41
SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackBar中设定一个Action,当用户点击了SnackBar里面的按钮的时候,可以进行一些操作,所以,功能绝对是很强大的。
SnackBar的构造:
// 参数分别是父容器,提示信息,持续时间public static Snackbar make(@NonNull View view, @NonNull CharSequence text,@Duration int duration)
SnackBar的常用方法:
// 用于给SnackBar设定一个Action,点击之后会回调OnclickListener中的Onclick方法public Snackbar setAction(CharSequence text, final View.OnClickListener listener)
// 用于设定Action的字体颜色public Snackbar setActionTextColor(@ColorInt int color)
// 设定提示的字体public Snackbar setText(@NonNull CharSequence message)
// 展示SnackBarpublic void show()
// 清除SnackBarpublic void dismiss()
// 设置回调,比如OnDismissed或者OnShownpublic Snackbar setCallback(Callback callback)
简单是使用就不说了,这里直接说一下设置Action和设置Callback
要求:实现一个撤销的操作,用户点击列表中每一项的删除按钮之后,删除(数据库中)对应的行,然后弹出SnackBar提示是否撤销,如果选择是,则恢复删除的行,否则删除该行,效果如下
思路:
①先对我们要删除的这个行进行备份,然后在点击删除按钮的时候把行删除,把数据从源删除,然后刷新
②弹出SnackBar,设定Action,如果点了Yes,就把数据插入到源中,刷新
③设定CallBack,监听SnackBar的消失事件,如果不是点击Action而消失,则将数据从SQLite中删除
注意:这里为什么要设定监听?因为如果不进行监听,需要在删除的时候访问数据库,撤销是时候进行数据库的插入操作,这样列表中的条目位置会发生改变
我们可以在Adapter中对删除按钮进行监听,代码如下:
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
backupMap = mdata.get(position);
mdata.remove(position);
notifyDataSetChanged();
Snackbar snackBar = Snackbar.make(root, "是否撤销删除?", Snackbar.LENGTH_LONG);
snackBar.setAction("YES", new MyOnClickListener(position));
snackBar.setCallback(new MyCallback());
snackBar.show();
}
});
如果点击了删除按钮,我们对数据进行备份,然后删除数据源mdata对应的这个map,接下来刷新界面。然后第7行构造了一个SnackBar,询问是否撤销删除,并把持续时间设置为LONG以免用户未阅读完文字SnackBar就消失了。第8行设定了点击的Action,提示信息为“YES”,并提供了点击的监听。第9行设定了Callback,判断SnackBar的消失状态。第10行就直接把SnackBar展示出来。
下面来看Action的点击事件:
private class MyOnClickListener implements View.OnClickListener {
private final int position;
public MyOnClickListener(int position) {
this.position = position;
}
@Override
public void onClick(View v) {
mdata.add(position, backupMap);
notifyDataSetChanged();
}
}
如果点击了Action,就用备份的数据进行恢复
下面看Callback:
private class MyCallback extends Snackbar.Callback {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
if (event == DISMISS_EVENT_SWIPE || event == DISMISS_EVENT_TIMEOUT || event ==
DISMISS_EVENT_CONSECUTIVE) {
mdatabase.execSQL("delete from tally where id=?", new String[]{backupMap.get
("id").toString()});
}
}
}
这里看到我们重写了onDismissed方法,在SnackBar消失的时候会回调这个方法,我们先判断这个消失的类型,如果是点击了Action,就不用删除数据库中的数据,否则就对数据库进行删除。
SnackBar消失的类型对应的常量:
/** Indicates that the Snackbar was dismissed via a swipe.*/public static final int DISMISS_EVENT_SWIPE = 0;/** Indicates that the Snackbar was dismissed via an action click.*/public static final int DISMISS_EVENT_ACTION = 1;/** Indicates that the Snackbar was dismissed via a timeout.*/public static final int DISMISS_EVENT_TIMEOUT = 2;/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/public static final int DISMISS_EVENT_MANUAL = 3;/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/public static final int DISMISS_EVENT_CONSECUTIVE = 4;
可以看到,从0到4分别是滑动清除、点击Action、持续时间结束、调用dismiss方法以及有新的SnackBar产生
因为每次SnackBar消失的时候都是调用了dismiss方法,所以我们只需要判断此时的状态是否为滑动清除、持续时间结束或者新的SnackBar产生,如果是,则证明用户不需要撤销,则对数据库进行删除。
最后,如果使用SnackBar,记得添加依赖!!


猜你喜欢
- 前言相信大家在Android日常开发中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了。以前为了偷懒就直接去github
- 本文实例讲述了Android实现SQLite添加、更新及删除行的方法。分享给大家供大家参考,具体如下:SQLiteDatabase类暴露了特
- 目录1. SpringMVC默认三个异常处理类2. @ExceptionHandler注解异常3. @ResponseStatus注解异常4
- 前言:先写个简单的地点签到功能,如果日后有时间细写的话,会更加好好研究一下百度地图api,做更多逻辑判断。这里主要是调用百度地图中的场景定位
- 对于yield关键字我们首先看一下msdn的解释:如果你在语句中使用 yield 关键字,则意味着它在其中出现的方法、运算符或 get 访问
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 背景在工作中,遇到这样的场景:有个es索引构建服务,需要从各个业务服务获取索引的信息,从而构建索引,业务服务都实现同一个接口&mda
- 本文实例讲述了C#中IEnumerable接口用法。分享给大家供大家参考。具体分析如下:枚举数可用于读取集合中的数据,但不能用于修改基础集合
- 使用注解开发在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入context的约束,增加注解的支持<?x
- DataTable可以通过RowStatus来判断状态是否发生了改变。但是有些时候我们希望在行状态即使为Modified的情况下也不要提示内
- spring in action第三版读书笔记spring3.0引入了spring expression language(spel)语言,
- 本文实例讲述了C#微信公众号与订阅号接口开发示例代码。分享给大家供大家参考,具体如下:using System;using System.W
- 写在自定义之前我们也许会遇到,自定义控件的触屏事件处理,先来了解一下View类中的,onTouch事件和onTouchEvent事件。1、b
- 一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect Oriented Programming的缩写
- 前面文章讲解了Android的蓝牙基本用法,本文讲得深入些,探讨下蓝牙方面的隐藏API。用过Android系统设置(Setting)的人都知
- Spring Expression Language (SpEL)是强大的表达式语言,支持查询、操作运行时对象图,以及解析逻辑、算术表达式。
- 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法:public native int hash
- ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大
- 本文实例为大家分享了Android Studio实现简单计算器功能的具体代码,供大家参考,具体内容如下程序步骤:(1)在布局文件定义一些计算
- 前言作为一个开发者,日常会接触到很多优秀的软件,其实,或多或少会有这样的想法,我能不能开发一个自己软件,甚至办公软件都希望是Markdown