You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从RecyclerView Adapter触发展示带Lottie动画的自定义Snackbar

实现带Lottie动画的自定义Snackbar方案

首先确认你已经正确引入了必要依赖:Lottie动画库、Material Design组件库,且你的Lottie动画json文件已放置在res/raw目录下,命名为copy.json,同时给你布局文件里的TextView添加id@+id/snackbar_text方便后续动态修改文本。


具体实现步骤

  • 第一步:封装自定义Snackbar调用逻辑
    可以用Kotlin扩展函数或者Java静态方法封装调用逻辑,避免重复代码:

Kotlin 示例代码

fun showCopySuccessSnackbar(hostView: View, message: String = "内容已复制到剪贴板") {
    // 1. 创建基础Snackbar实例
    val snackbar = Snackbar.make(hostView, "", Snackbar.LENGTH_SHORT)
    val snackbarLayout = snackbar.view as Snackbar.SnackbarLayout

    // 2. 移除Snackbar默认样式干扰
    snackbarLayout.setPadding(0, 0, 0, 0)
    snackbarLayout.setBackgroundColor(Color.TRANSPARENT)
    // 隐藏默认自带的TextView
    val defaultTextView = snackbarLayout.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
    defaultTextView.visibility = View.GONE

    // 3. 加载自定义布局
    val customSnackView = LayoutInflater.from(hostView.context).inflate(R.layout.layout_custom_copy_snackbar, null)
    // 动态设置提示文本
    customSnackView.findViewById<TextView>(R.id.snackbar_text).text = message
    // 主动触发Lottie动画,和布局里的autoPlay配置形成双保险
    customSnackView.findViewById<LottieAnimationView>(R.id.lottieSnakbar).playAnimation()

    // 4. 添加自定义布局到Snackbar
    snackbarLayout.addView(customSnackView, 0)
    // 5. 展示Snackbar
    snackbar.show()
}

Java 示例代码

public static void showCopySuccessSnackbar(View hostView, String message) {
    // 1. 创建基础Snackbar实例
    Snackbar snackbar = Snackbar.make(hostView, "", Snackbar.LENGTH_SHORT);
    Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbar.getView();

    // 2. 移除默认样式干扰
    snackbarLayout.setPadding(0,0,0,0);
    snackbarLayout.setBackgroundColor(Color.TRANSPARENT);
    TextView defaultText = snackbarLayout.findViewById(com.google.android.material.R.id.snackbar_text);
    defaultText.setVisibility(View.GONE);

    // 3. 加载自定义布局
    View customView = LayoutInflater.from(hostView.getContext()).inflate(R.layout.layout_custom_copy_snackbar, null);
    TextView textView = customView.findViewById(R.id.snackbar_text);
    textView.setText(message);
    LottieAnimationView lottie = customView.findViewById(R.id.lottieSnakbar);
    lottie.playAnimation();

    // 4. 添加布局并展示
    snackbarLayout.addView(customView, 0);
    snackbar.show();
}
  • 第二步:在长按复制的回调中调用
    在你已实现的长按链接复制逻辑末尾,调用上述封装好的方法即可,宿主View推荐传入当前Activity的根布局,避免展示异常:
// Kotlin 调用示例(在Activity中使用)
showCopySuccessSnackbar(findViewById(android.R.id.content), "链接已复制到剪贴板")

常见异常排查

  • Lottie加载异常:确认res/raw目录下存在copy.json文件,文件名大小写和布局中配置的完全一致
  • Snackbar不展示:确认传入的hostView是当前页面存活的View,不要使用已销毁页面的View实例
  • 样式重叠:确认已经把Snackbar默认背景设为透明,且隐藏了默认的TextView

内容的提问来源于stack exchange,提问作者Sambhav Khandelwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:36:03