☰
SnackBar已弃用?一份从旧库平滑迁移到Design Support Library Snackbar的完整指南
2026/10/14 17:56:26 网站建设 项目流程
  • 移动开发
  • UI库/组件

【免费下载链接】SnackBar

toast-like alert pattern for Android inspired by the Google Material Design Spec

项目地址:https://gitcode.com/gh_mirrors/sna/SnackBar
点击查看免费下载

如果你正在维护一个 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();

关键变化:

  1. 入口变了:new SnackBar.Builder(activity)→Snackbar.make(锚定View, 文本, 时长)。第一个参数是 Snackbar 要"贴"上去的父视图,Activity 里传根视图,Fragment 里传getView()的根布局
  2. 回调变了:旧的OnMessageClickListener.onMessageClick(Parcelable token)简化为普通View.OnClickListener,token 传值的需求通常可省略
  3. 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

项目地址:https://gitcode.com/gh_mirrors/sna/SnackBar
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询