- 移动开发
- UI库/组件
【免费下载链接】SnackBar
toast-like alert pattern for Android inspired by the Google Material Design Spec
如果你正在维护一个 Android 项目,还在用第三方库 SnackBar(com.github.mrengineer13:snackbar)弹出 Material Design 风格的底部轻提示,那么这篇迁移指南会帮你把它平滑切换到 Design Support Library 自带的Snackbar组件,全程不到半小时。
📌先说结论:SnackBar 是一个仿 Google Material Design 的 toast-like 底部通知条库,作者已在 README.md 中明确宣布弃用(Deprecated),官方推荐迁移到 Design Support Library 中的android.support.design.widget.Snackbar(AndroidX 项目则对应com.google.android.material.snackbar.Snackbar)。旧库停止维护意味着 bug 不再修复、新系统不兼容,迁移是迟早的事。
一、SnackBar 为什么被弃用?
旧库的核心能力包括:设置消息文本与显示时长、同一时间只显示一条消息(内部队列)、附带 Action 按钮(如"撤销"、"刷新")、自定义 Action 文字颜色、向下滑动关闭,并向下兼容到 Android 2.3。这些功能如今都已内置进官方 Design Support Library,官方实现还获得了持续的维护和系统级适配,这就是弃用的直接原因。
在动手前,先花一分钟回顾旧库的 API 形态,方便后面逐项对照:
- 时长常量(定义于 SnackBar.java):
SHORT_SNACK = 2000ms、MED_SNACK = 3500ms、LONG_SNACK = 5000ms、PERMANENT_SNACK = 0 - 样式枚举
Style:DEFAULT/ALERT(红)/CONFIRM(绿)/INFO(黄),控制 Action 按钮颜色 - 队列机制:SnackContainer.java 内部维护一个
Queue<SnackHolder>,消息逐条出队展示 - 状态保存:需要手动调用
onSaveInstanceState()/onRestoreInstanceState(Bundle)配合 Activity 生命周期
官方示例工程里的典型写法见 SnackBarActivity.java,典型的 Builder 链式调用长这样:
new SnackBar.Builder(this) .withOnClickListener(this) .withMessage("This library is awesome!") .withActionMessage("Action") .withDuration(SnackBar.MED_SNACK) .show();二、四步完成 SnackBar 到 Snackbar 的迁移
第 1 步:替换 Gradle 依赖
在build.gradle中移除旧库依赖:
// 移除这一行 compile 'com.github.mrengineer13:snackbar:1.2.0'然后按项目现状添加新依赖(二选一):
// 情况 A:项目仍在使用 com.android.support 体系 implementation 'com.android.support:design:23.1.1' // 情况 B:项目已升级到 AndroidX(推荐) implementation 'com.google.android.material:material:1.4.0'⚠️ 注意
com.android.support与 AndroidX 两套体系不能混用,添加新依赖前先确认项目的迁移状态(gradle.properties中是否有android.useAndroidX=true)。
第 2 步:用 Snackbar.make() 重写调用
新组件不再使用 Builder,而是静态工厂方法 + 锚定视图的模式。以第 1 节的旧代码为例,迁移后是:
Snackbar.make(findViewById(android.R.id.content), "This library is awesome!", Snackbar.LENGTH_LONG) .setAction("ACTION", v -> doAction()) .show();关键变化:
- 入口变了:
new SnackBar.Builder(activity)→Snackbar.make(锚定View, 文本, 时长)。第一个参数是 Snackbar 要"贴"上去的父视图,Activity 里传根视图,Fragment 里传getView()的根布局 - 回调变了:旧的
OnMessageClickListener.onMessageClick(Parcelable token)简化为普通View.OnClickListener,token 传值的需求通常可省略 - Fragment 场景更简单了:旧库要写
new SnackBar.Builder(context, root)双参构造,新库直接Snackbar.make(root, ...)
全局搜索new SnackBar.Builder可以一次性定位所有需要改写的位置。
第 3 步:按 API 对照表逐项替换
下面是完整的迁移速查表(旧写法 → 新写法):
| 旧 SnackBar 库 | 新 Snackbar(Design Support / Material) |
|---|---|
new SnackBar.Builder(activity) | Snackbar.make(view, text, duration) |
.withMessage("msg")/.withMessageId(id) | make()的第 2 个参数(字符串或getText(id)) |
.withActionMessage("Undo")+.withOnClickListener(l) | .setAction("UNDO", listener) |
.withDuration(SnackBar.SHORT_SNACK)(2000ms) | Snackbar.LENGTH_SHORT |
.withDuration(SnackBar.LONG_SNACK)(5000ms) | Snackbar.LENGTH_LONG |
.withDuration(SnackBar.PERMANENT_SNACK)(0) | Snackbar.LENGTH_INDEFINITE+.dismiss()手动关闭 |
.withStyle(Style.ALERT / CONFIRM / INFO) | 无对应枚举,用主题色或自绘 Action 按钮颜色 |
.withBackgroundColorId(colorId) | .setBackgroundTint(ColorStateList) |
.withClearQueued(animate) | 新库无队列概念,snackbar.dismiss()即可 |
snackBar.clear()/hide() | snackbar.dismiss() |
onSaveInstanceState()/onRestoreInstanceState(bundle) | 无需手动处理,交由框架管理 |
两个细节提醒:
- 时长只有三档:旧库有
MED_SNACK(3500ms)这一档,新库没有精确对应,按业务语义选LENGTH_SHORT或LENGTH_LONG即可;实际毫秒数与旧库不同,如有测试用例依赖精确时长记得调整 - Action 文字不再自动大写:旧库 SnackBar.java 的
show()内部会对 action 文本执行toUpperCase(),新库按原样显示,想要全大写需自行处理
第 4 步:验证行为差异并回归测试
替换完成后,重点回归这几个交互点:按钮点击回调是否生效、LENGTH_INDEFINITE场景是否正确调用了dismiss()、旋转屏幕/切后台后表现是否符合预期。
三、迁移常见坑位:这些行为差异必须知道
🚨 旧库和新组件不只是 API 不同,默认行为也有 3 处差异,直接照抄代码可能踩坑:
坑 1:消息队列没了旧库内部用队列保证"同一时间只显示一条、其余排队展示"(见 SnackContainer.java)。而新库中,如果同一视图上已有 Snackbar 正在展示,Snackbar.make()会直接返回已存在的实例,新内容不会显示。如果你的业务依赖"连续弹多条提示逐条展示",需要自己实现一个基于回调的排队逻辑。
坑 2:向下滑动关闭不支持旧库支持用户向下滑动手势关闭全部通知;新的Snackbar是纯展示组件,不提供滑动关闭交互。如果产品文档里写了这个交互,需另行实现或与设计确认。
坑 3:可见性回调没有一一对应旧库提供OnVisibilityChangeListener(onShow/onHide携带剩余条数),新库没有公开的同名监听。若业务依赖展示/隐藏时机,可以退而求其次:用.setAction的点击时机、或结合Handler.postDelayed与时长估算。
四、迁移检查清单(可直接照做)
- 移除
com.github.mrengineer13:snackbar依赖 - 按项目体系添加
com.android.support:design或com.google.android.material:material - 全局搜索
new SnackBar.Builder,全部改写为Snackbar.make(...) - 用上方对照表核对时长、样式、背景色参数
- 确认是否依赖消息队列 / 滑动关闭 / 可见性回调,按需补充实现
- 真机回归:按钮回调、屏幕旋转、Fragment 场景
源码结构参考:库主体在 snackbar/src/main/java/com/github/mrengineer13/snackbar/(含 SnackBar.java 与 Snack.java),演示工程在 sample/。
五、总结
SnackBar 是 Material Design 底部轻提示的经典第三方实现,如今它已正式退役,Design Support Library / Material Components 的Snackbar是官方指定的替代方案。迁移路径很清晰:换依赖 → 换入口(Builder 变 make)→ 对表替换参数 → 补齐三处行为差异。完成后你的提示条将随 Android 官方组件一起长期获得维护与适配,再也不用担心"库已弃用"的告警了 ✅
- 移动开发
- UI库/组件
【免费下载链接】SnackBar
toast-like alert pattern for Android inspired by the Google Material Design Spec
相关推荐
终极Chocolatey迁移指南:从旧版本到新choco的无缝过渡方案
终极Chocolatey迁移指南:从旧版本到新choco的无缝过渡方案 Chocolatey作为Windows系统上的包管理工具,曾以"Windows上的apt
开发工具运维Ant Design 5.0 终极迁移指南:从旧版本平滑升级的完整教程
Ant Design 5.0 终极迁移指南:从旧版本平滑升级的完整教程 作为企业级UI设计语言和React组件库,Ant Design 5.0带来了革命性的变化
UI组件前端设计系统Brick Design版本升级完全指南:从旧版本平滑迁移到新版本的完整教程
Brick Design版本升级完全指南:从旧版本平滑迁移到新版本的完整教程 Brick Design作为一款优秀的低代码框架,持续迭代为用户带来更强大的可视化
低代码前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考