Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 自定义 Snackbar

Android 自定义 Snackbar

作者头像
用户8928967
发布于 2023-02-28 07:40:05
发布于 2023-02-28 07:40:05
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

Snackbar: Android 官方的一个控件,在 Android 应用中也算很常见了,用来显示应用交互中正在发生的消息,跟 Toast 类似,又有所区别,关于它的简单介绍和使用见上篇。Android 关于 Snackbar 基本使用。

本篇,主要就是来实践一下自定义 Snackbar。

一、给 Snackbar 创建自定义布局

view_custom_snackbar.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/secondaryRealgar_1A"
    android:paddingHorizontal="@dimen/aroundMargins"
    android:paddingVertical="@dimen/aroundMargins10">

    <ImageView
        android:id="@+id/img_logo"
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:src="@drawable/ic_status_accelerating"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/aroundMargins10"
        android:text="You are Great!"
        android:paddingHorizontal="@dimen/aroundMargins10"
        android:paddingVertical="6dp"
        android:background="@drawable/shape_cyan_stroke_20"
        android:textColor="@color/baseCyan"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/img_logo"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

这里示例布局就很简单的给一段文字右边添加了一张logo图片。

二、让自定义 Snackbar 布局类实现 ContentViewCallback 方法

CustomSnackbarView.kt:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CustomSnackbarView @JvmOverloads constructor(
    context: Context,
    attributeSet: AttributeSet? = null,
    defaultStyle: Int = 0
) : ConstraintLayout(context, attributeSet, defaultStyle), ContentViewCallback {

    private val binding = inflate<ViewCustomSnackbarBinding>()

    init {
        // ...
    }

    override fun animateContentIn(delay: Int, duration: Int) {
        // TODO("Use some animation")
        Log.i("yyyyy", "animateContentIn delay = $delay || duration = $duration")
    }

    override fun animateContentOut(delay: Int, duration: Int) {
        // TODO("Use some animation")
        Log.i("yyyyy", "animateContentOut delay = $delay || duration = $duration")
    }
}

在这里可以在代码本身中自定义 Snackbar 的内容,更改文本消息,更新图像。默认情况就是我们在 xml 中定义的,可以看出来,我这里示例并没有做任何的修改,当然需要修改成啥还是根据需求来吧,可以灵活的给外部提供方法调用修改内容或者是图片。

这里 ContentViewCallback 也有两个实现,分别为 animateContentInanimateContentOut,它们是 Snackbar 的内容从屏幕上出现和消失时产生一些动画,我们可以在此设计它成为我们想要的动画。

三、继承 BaseTransientBottomBar

最终步骤了,其实我们点入 Snackbar 也可以看到,它继承了 BaseTransientBottomBar,因此可以猜到,我们需要自定义,当然也得走这一步。

Snackbar

然后我们也需要实现入口方法make(),现在先将 xml 视图创建好:

custom_snackbar.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<com.viabtc.pool.main.mine.callboard.CustomSnackbarView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

然后是 CustomSnackbar.kt:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.viabtc.pool.R

class CustomSnackbar(
    parent: ViewGroup,
    content: CustomSnackbarView
) : BaseTransientBottomBar<CustomSnackbar>(parent, content, content) {

    init {
        getView().setBackgroundColor(
            ContextCompat.getColor(
                view.context,
                android.R.color.transparent
            )
        )
        getView().setPadding(0, 0, 0, 0)
    }

    companion object {

        fun make(viewGroup: ViewGroup): CustomSnackbar {

            val customSnackbar = LayoutInflater.from(viewGroup.context).inflate(R.layout.custom_snackbar, viewGroup, false) as CustomSnackbarView

            return CustomSnackbar(viewGroup, customSnackbar)
        }
    }
}

调用运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CustomSnackbar.make(binding.root).show()

结果:

run

并且可以看到打印日志:

log

总结:

之所以我们需要自定义 Snackbar,还是源于需求,从 Snackbars Material Design 可以看到,它并不建议我们添加图片。

因此,我们如果还是需要在底部弹出带图片的 Snackbar,并且方便调用者调用,就可以考虑自定义 Snackbar 了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 妮K妮K妮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
上一篇文章我们介绍了Android Studio的安装以及Android SDK的目录结构。这篇文章将介绍如何使用Android Studio创建第一个Android应用,重点介绍Android Studio的目录结构。
玖柒的小窝
2021/09/20
7900
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
Android自定义View
前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。在此总结一下关于Android 自定义View的用法:
指点
2019/01/18
6320
Android自定义View
轻量级控件SnackBar使用以及源码分析
本篇博客将会给大家带来一个轻量级控件SnackBar,为什么要讲SnackBar?Snackbar:的提出实际上是界于Toast和Dialog的中间产物。因为Toast与Dialog各有一定的不足,使用Toast的时候, 用户无法交互;使用Dialog:用户可以交互,但是体验会打折扣,会阻断用户的连贯性操作;但是使用Snackbar既可以做到轻量级的用户提醒效果,又可以有交互的功能,本博客将会从SnackBar的使用和源码分析两个方面进行介绍。
老马的编程之旅
2022/06/22
1.5K0
轻量级控件SnackBar使用以及源码分析
Android自定义控件
时隔一年,用新知识重构一个老库一年前,用 Java 写了一个高可扩展选择按钮库。单个控件实现单选、多选、菜单选,且选择模式可动态扩展。
前端小tips
2021/11/28
6K0
Android自定义控件
Android – DataBinding 自定义setter
在APP中我们经常会遇到下面的UI 图片来源于今日头条APP个人中心界面的截图 下面咱们进入主题正式介绍如何使用databinding来自定义setter。 先上效果图: databinding自定
code_horse
2018/07/02
6040
android 自定义下拉菜单
    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计。弹出的动画效果主要用到了translate、alpha、scale,具体实现步骤如下
xiangzhihong
2018/02/02
1.7K0
android 自定义下拉菜单
「Android 自定义 View」—— AreaSelectLayout
前几天写了一个小工具,其中一个设置项需要屏幕区域范围坐标参数,由于通过观察直接填写坐标信息不太现实,于是就有了通过直接拖拽屏幕去取这个参数的需求,又因为需要在任意界面都能选取,所以就想到了悬浮窗,这里以前写过一个悬浮窗工具类《FloatWindowUtils 实现及事件冲突解决详解》,想着再加一些手势及绘制应该就能实现,于是吭叽吭叽搞了半天,发现其中还是有些坑的,所以在此记录备忘。
SkyRiN
2019/03/15
6270
Android 音乐APP(三)播放音乐、自定义进度条、自动下一曲
  作为音乐APP的主要功能,我放到了第三篇文章,因为播放音乐的功能并没有看上去那么简单,里面有很多细节是在写代码的时候就要考虑,并且加入到逻辑里面的,这可不是危言耸听,下面来看是怎样一个不简单吧。
晨曦_LLW
2020/10/29
2.4K0
Android 音乐APP(三)播放音乐、自定义进度条、自动下一曲
Android 自定义View 之 Dialog弹窗
  在日常开发中用到弹窗是比较多的,常用于提示作用,比如错误操作提示,余额不足提示,退出登录提示等,还有用于数据展示的弹窗,上拉弹窗等等,主要为了简化在日常开发中的使用。
晨曦_LLW
2023/07/10
1.2K0
Android 自定义View 之 Dialog弹窗
Android--Snackbar基本使用以及源码分析
Snackbar是谷歌集成的design包下的一个用于消息提示的控件,介于Dialog和Toast之间,结合了两者的优点,又解决了Dialog强提示和Toast无法交互的缺点,使用方法也很简单,首先我们需要引入design包,然后在代码中调用 public void click(View view) { Snackbar.make(view, "这是一个提示", Snackbar.LENGTH_SHORT).show(); } 其中第二个参数是提示内容,第三个参数是消失的时间
aruba
2020/07/02
1.4K0
Android 天气APP(八)城市切换 之 自定义弹窗与使用
弹窗也是需要布局文件的,现在创建一个新的布局文件,用于显示城市列表。 返回图标:
晨曦_LLW
2020/09/25
1.5K0
安卓自定义列表dialog
这个形式也是最常用的,不过最近需要用到列表信息Dialog,原生的不光样式不能满足需求,而且是开发电视端的APP,需要对焦点进行特殊处理,所以就需要自定义Dialog
先知先觉
2019/01/21
1.4K0
Android开发之自定义View(二)
在 Android开发之自定义View(一)中,讲解了最复杂的一种自定义View,本次将剩下的两种讲完~~~ go,go,go 继承原有的控件,在原有控件基础上进行修改,如TextView,这种方式常
YungFan
2018/04/24
7620
Android开发之自定义View(二)
Jetpack组件之DataBinding
Android 布局文件通常只负责UI的布局工作,页面通过setContentView()关联布局文件,再通过UI控件的id找到控件,接着在页面中通过代码对控件进行操作,因此,页面承担了很大的工作量.为了减轻页面的工作量,Google推出了DataBinding,使得页面和布局之间的耦合度降低。
八归少年
2022/06/29
1.3K0
Jetpack组件之DataBinding
Android 自定义View 之 Mac地址输入框
  在日常工作开发中,我们时长会遇到各种各样的需求,不部分需求是可以通过Android 原生的View来解决,而有一些是无法解决的,这时候我们就需要自定义View,我们先来看看本文中这个自定义View的演示效果图。
晨曦_LLW
2023/03/25
1.3K0
Android 自定义View 之 Mac地址输入框
Android:流式布局实现总结
关于自定义FlowLayout,原理就是自定义一个ViewGroup,向里动态的添加条目View。在添加的时候需要动态的计算行数,以及行中剩余宽度是否可以展示目标条目。这种方式网上有很多讲解,此处不再赘述,推荐参考鸿洋大佬的:https://github.com/hongyangAndroid/FlowLayout
CnPeng
2020/08/11
5.7K0
Android材料设计之FloatingActionButton+Snackbar+SheetX3
本文把几个小东西讲一下 FloatingActionButton:浮动按钮 Snackbar:底弹框 BottomSheet:底抽屉 BottomSheetDialog :抽屉对话框 Bot
张风捷特烈
2018/12/19
9670
相关推荐
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验