Android Snackbar的使用

article/2025/9/18 18:55:24

在项目中肯定有不少地方用到Toast,但是在项目各种各样的需求上,Toast已经不能满足我们的需求了。
其实google在Android 5.0的时候就推出了Snackbar,它算是Toast的一个进阶控件。
它是Material Design中的一个控件,与Toast的最大区别就是它可以与用户进行交互–也就是说它可以处理用户的点击事件。

用法

它需要配合CoordinatorLayout使用,可以在xml中写个CoordinatorLayout也可以使用下面的代码获取CoordinatorLayout

View decorView = getWindow().getDecorView();
CoordinatorLayout coordinatorLayout = decorView.findViewById(R.id.content);

简单用法

Snackbar.make(coordinatorLayout,"展示Snackbar",Snackbar.LENGTH_SHORT).show();

是不是看着很面熟,不能说给Toast的用法差不多,那简直是一模一样啊。上个Toast的用法对比一下:

Toast.makeText(this,"展示Snackbar",Toast.LENGTH_SHORT).show();

是不是看着一模一样。
用法是一样的,但是展示的位置是不一样的,Toast默认展示位置是靠近在屏幕的底部,而Snackbar的默认展示位置是在屏幕的底部

在这里插入图片描述
靠上的那个是Toast所展示的内容,下面的撑满屏幕的则是Snackbar所展示的内容。

稍微进阶一点的用法

// Snackbar.make方法会返回一个Snackbar实例,可以拿到这个实例去执行show和dismiss等方法。
// Snackbar snackbar = Snackbar.make(coordinatorLayout, "展示Snackbar", Snackbar.LENGTH_SHORT);
// snackbar.show();
Snackbar.make(coordinatorLayout,"展示Snackbar",Snackbar.LENGTH_SHORT).setAction("关闭", v1 -> {Log.d("TAG", "点击了关闭");// snackbar.dismiss();
}).show();

在这里插入图片描述
多了个关闭的按钮,这个就是我们刚刚设置的Action
在这里插入图片描述
这是点击之后的log信息,点击关闭之后可以手动调用Snackbar的dismiss()方法关闭Snackbar。

到这里Snackbar的简单用法和稍微进阶一点点的用法已经介绍完了。


下面来讲一下进阶用法,比如说自定义布局,自定义位置等。

自定义布局

其实自定义布局也是非常简单:

  1. 通过Snackbar.getView获取到view
  2. 通过LayoutInflater去加载布局得到自定义的布局view
  3. 通过 1 中获取到的view添加 2 中加载好的布局view
  4. 通过 1 中得到的自定义布局获取里面的控件去执行一些操作,比如说点击事件,设置文字和文字颜色等等
View rootView = this.getWindow().getDecorView();
View coordinatorLayout = rootView.findViewById(android.R.id.content);
Snackbar snackbar = Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_SHORT);
// 上面的三行代码给咱们上面说过的是一样的,这里也就不添加注释了
// 获取到Snackbar.getView获取的Snackbar的view
Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
// 加载咱们自定义的布局
View inflate = LayoutInflater.from(snackbar.getView().getContext()).inflate(R.layout.snacbar_layout, null);
// 通过自定义布局中的控件
TextView text = inflate.findViewById(R.id.textView);
// 设置自定义的文案
text.setText("自定义布局的Snackbar");
// 通过自定义布局中的控件
ImageView imageView = inflate.findViewById(R.id.imageView);
// 设置点击事件
imageView.setOnClickListener(v1 -> Log.d("TAG", "点击了自定义布局中的控件"));
// 将获取的自定义布局view添加到SnackbarView中
snackbarView.addView(inflate);
// 展示
snackbar.show();

到这里加载自定义布局已经基本完成,但是在实践中发现了一个小坑。
在这里插入图片描述

这里我们自定义的布局并没有撑满到整个SnackbarView,而是在红框里面颜色比较深的就是Snackbar原来的布局背景颜色。所以这里我们需要处理一下这个情况:

View rootView = this.getWindow().getDecorView();
View coordinatorLayout = rootView.findViewById(android.R.id.content);
Snackbar snackbar = Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_SHORT);
// 上面的三行代码给咱们上面说过的是一样的,这里也就不添加注释了
// 设置SnackbarView的padding都为0,避免上图中出现黑色边框背景的情况
snackbar.getView().setPadding(0,0,0,0);
// 将SnackbarView的背景颜色设置为透明,避免在自定义布局中有圆角或者自适应宽度的时候显示一块黑色背景的情况
snackbar.getView().setBackgroundColor(Color.TRANSPARENT);
// 获取到Snackbar.getView获取的Snackbar的view
Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
// 加载咱们自定义的布局
View inflate = LayoutInflater.from(snackbar.getView().getContext()).inflate(R.layout.snacbar_layout, null);
// 通过自定义布局中的控件
TextView text = inflate.findViewById(R.id.textView);
// 设置自定义的文案
text.setText("自定义布局的Snackbar");
// 通过自定义布局中的控件
ImageView imageView = inflate.findViewById(R.id.imageView);
// 设置点击事件
imageView.setOnClickListener(v1 -> Log.d("TAG", "点击了自定义布局中的控件"));
// 将获取的自定义布局view添加到SnackbarView中
snackbarView.addView(inflate);
// 展示
snackbar.show();

相比与上面的代码,下面修改过的代码只比上面的代码多了两行

// 设置SnackbarView的padding都为0,避免上图中出现黑色边框背景的情况
snackbar.getView().setPadding(0,0,0,0);
// 将SnackbarView的背景颜色设置为透明,避免在自定义布局中有圆角或者自适应宽度的时候显示一块黑色背景的情况
snackbar.getView().setBackgroundColor(Color.TRANSPARENT);

到这里自定义布局就基本完成了。


自定义位置

这里说一说自定义位置,在项目中Snackbar只显示在底部肯定是不能满足产品的变态需求的,所以就出现了这个问题。
其实这个自定义位置也是很简单

  1. 获取到SnackbarView的LayoutParams
  2. 通过1 中获取到的LayoutParams创建新的LayoutParams
  3. 2中的LayoutParams设置Gravity
  4. 将新的LayoutParams设置给SnackbarView

废话不多说,上代码:

View rootView = this.getWindow().getDecorView();
View coordinatorLayout = rootView.findViewById(android.R.id.content);
Snackbar snackbar = Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_SHORT);
// 上面的三行代码给咱们上面说过的是一样的,这里也就不添加注释了
// 设置SnackbarView的padding都为0,避免上图中出现黑色边框背景的情况
snackbar.getView().setPadding(0,0,0,0);
// 将SnackbarView的背景颜色设置为透明,避免在自定义布局中有圆角或者自适应宽度的时候显示一块黑色背景的情况
snackbar.getView().setBackgroundColor(Color.TRANSPARENT);
// 获取到Snackbar.getView获取的Snackbar的view
Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
// 获取到SnackbarView的LayoutParams
ViewGroup.LayoutParams layoutParams = snackbarView.getLayoutParams();
// 新建一个LayoutParams将SnackbarView的LayoutParams的宽高传入
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(layoutParams.width, layoutParams.height);
// 设置新的元素位置
// Gravity有许多属性,基本上可以满足大众需求, 我们这里设置了处于屏幕的中央
fl.gravity = Gravity.CENTER;
// 将新的LayoutParams设置给SnackbarView
snackbarView.setLayoutParams(fl);
// 加载咱们自定义的布局
View inflate = LayoutInflater.from(snackbar.getView().getContext()).inflate(R.layout.snacbar_layout, null);
// 通过自定义布局中的控件
TextView text = inflate.findViewById(R.id.textView);
// 设置自定义的文案
text.setText("自定义布局的Snackbar");
// 通过自定义布局中的控件
ImageView imageView = inflate.findViewById(R.id.imageView);
// 设置点击事件
imageView.setOnClickListener(v1 -> Log.d("TAG", "点击了自定义布局中的控件"));
// 将获取的自定义布局view添加到SnackbarView中
snackbarView.addView(inflate);
// 展示
snackbar.show();

相比于前一段代码也只是多了几行

// 获取到SnackbarView的LayoutParams
ViewGroup.LayoutParams layoutParams = snackbarView.getLayoutParams();
// 新建一个LayoutParams将SnackbarView的LayoutParams的宽高传入
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(layoutParams.width, layoutParams.height);
// 设置新的元素位置
// Gravity有许多属性,基本上可以满足大众需求, 我们这里设置了处于屏幕的中央
fl.gravity = Gravity.CENTER;
// 将新的LayoutParams设置给SnackbarView
snackbarView.setLayoutParams(fl);

到这里自定义Snackbar基本就完成了。


这里还有一个小坑,就是在Android SDK 21的时候添加了一个深度属性Elevation,如果有其他的控件设置了这个属性的话,可能会把Snackbar遮挡住。
解决方法也很简单,只需要加入一个判断就行

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {snackBar.getView().setElevation(0);
}

到这里基本上就大功告成了!
写了个Util已经上传到github,觉得有用的话可以点个star


http://chatgpt.dhexx.cn/article/hbdSiwKy.shtml

相关文章

Snackbar的使用和顶部Snackbar实现

下载链接:Snackbar顶部显示 也可以module的形式直接导入使用 :module导入教程 谷歌在android 5.0 发布后,随后公布了design库和设计理念(需翻墙),意图在于规范安卓app的风格,类似而不仅仅ios的…

SnackBar 简单使用

1.简介 Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用.可以添加点击行为。多用于结合协调布局使用(CoordinatorLayout)。 implementation com.android.support:design:28…

MaterialDesign之Snackbar学习笔记

近期实在太忙了,看到好的文章先转载,后续自己慢慢消化吧! 转载 http://www.jianshu.com/p/cd1e80e64311#rd 没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南 字数2405 阅读1628 评论4 喜欢54 本文是在《Design…

Snackbar使用详解

Snackbar Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用。 开发出一个好的产品,友好的交互是不可缺少的,通常给用户提示信息的方式有三种:Dialog、Toast、Sn…

Snackbar使用详解及其相关框架TSnackbar

简述: Snackbar 是 Android design support library 中的一个组件,它的作用和Toast类似,显示吐司,但Snackbar的特别之处在于Snackbar显示的提示信息可以和用户交互,更好地获取用户反馈信息。同时,它显示的吐…

HAWQ:基于 Hessian 的混合精度神经网络量化

HAWQ:基于 Hessian 的混合精度神经网络量化 摘要动机方法海森方法的有效性分析海森矩阵方法推导根据幂迭代求海森矩阵的最大特征值根据海森矩阵最大特征值确定量化精度与顺序 实验结果ResNet20 On CIFAR-10ResNet50 on ImageNetSqueezeNext on ImageNetInception-V3…

HAWQ技术解析(二) —— 安装部署

一、安装规划1. 选择安装介质 HAWQ的安装介质有两种选择,一是下载源码手工编译,二是使用Pivotal公司提供的HDB安装包。源码的下载地址为 http://apache.org/dyn/closer.cgi/incubator/hawq/2.0.0.0-incubating/apache-hawq-src-2.0.0.0-incubating.tar.…

HAWQ取代传统数仓实践(二)——搭建示例模型(MySQL、HAWQ)

一、业务场景 本系列实验将应用HAWQ数据库,为一个销售订单系统建立数据仓库。本篇说明示例的业务场景、数据仓库架构、实验环境、源和目标库的建立过程、测试数据和日期维度的生成。后面陆续进行初始数据装载、定期数据装载、调度ETL工作流自动执行、维度表技术、事…

HAWQ从0.5开始安装说明.包含hadoop和hawq

文档是从自己的云笔记中复制,格式什么的可能有问题.已修复了一遍. 零.前提 一.安装hadoop 1.1下载并复制hadoop2.6.5 1.2编辑系统配置文件 1.3创建hadoop的tmp临时目录 1.4开始修改配置文件 1.5复制hadoop到其他所有节点上 1.6开始初始化hadoop 1.7 如果服务器重启了,…

开源数据库HAWQ,架构调研

hawq的简介 https://cloud.tencent.com/developer/article/1433137 HAWQ,全称Hadoop With Query(带查询Hadoop)。HAWQ使企业能够获益于经过锤炼的基于MPP的分析功能及其查询性能,同时利用Hadoop堆栈。HAWQ是一个Hadoop原生大规模…

apache hawq

为什么80%的码农都做不了架构师?>>> 资料地址: 导航页 What is HAWQ? HAWQ Architecture How HAWQ Manages Resources Understanding the Fault Tolerance Service Table Distribution and Storage Choosing the Table Distribution Pol…

HAWQ技术解析(一) —— HAWQ简介

一、SQL on Hadoop 过去五年里,许多企业已慢慢开始接受Hadoop生态系统,将它用作其大数据分析堆栈的核心组件。尽管Hadoop生态系统的MapReduce组件是一个强大的典范,但随着时间的推移,MapReduce自身并不是连接存储在Hadoop生态系统…

《HAWQ-V3: Dyadic Neural Network Quantization》论文阅读

HAWQ-V3阅读笔记 Abstract 混合精度量化,integer-only, Methodology 只采用均匀量化 权重对称量化,激活非对称量化,对量化步长S采用静态量化,采用per-channel的量化方式 3.1量化矩阵的乘法与卷积(核心…

HAWQ手动安装

HAWQ手动安装及使用手册 1 HAWQ简介 HAWQ 是 Pivotal 设计的一个大规模并行 SQL 分析处理引擎,支持事务处理。HAWQ 将复杂的查询分割成简单的任何,并分发到并行处理系统中的处理单元执行。包括查询规划器、动态管道、前沿互联和查询执行优化器等等。提…

HAWQ上安装PXF插件,并访问HDFS文件数据

1、说明 HAWQ在github上的地址为:https://github.com/apache/hawq 在安装pxf插件之前,可以先查看一下基础软件对应的版本信息:在hawq目录下的pxf/gradle.properties文件中 因我在安装pxf之前,已经把hadoop及hawq安装完&#xff…

HAWQ技术解析(五) —— 连接管理

服务器启动后,还要经过一系列配置,才能被客户端程序所连接。本篇说明如何配置客户端身份认证,HAWQ的权限管理机制,HAWQ最常用的命令行客户端工具psql及与mysql命令行常用命令类比,最后还将列举一些客户端连接HAWQ数据库…

HAWQ-V3: Dyadic Neural Network Quantization论文学习

论文链接 https://arxiv.org/abs/2011.10680 摘要 目前的低精度量化算法往往具有从浮点值到量化整数值的来回转换的隐藏代价。这种隐藏的成本限制了通过量化神经网络所实现的延迟改进。为了解决这个问题,我们提出了HAWQ-V3,一个新的混合精度纯整数量化框…

HAWQ取代传统数仓实践(一)——为什么选择HAWQ

一、HAWQ取代传统数仓实践(一)——为什么选择HAWQ 为了跟上所谓“大数据”技术的脚步,从两年前开始着手实践各种SQL-on-Hadoop技术,从最初的Hive,到SparkSQL,再到Impala,进行了一系列ETL、CDC、…

在centos 7.3上进行Apache HAWQ集群安装部署

一、前期准备工作 1、准备三台物理机,master(192.168.251.8),dataserver1(192.168.251.9),dataserver2(192.168.251.10); 2、目前最新版本是2.4.0, 官网下载地址&…

HAWQ

为了跟上所谓“大数据”技术的脚步,从两年前开始着手实践各种SQL-on-Hadoop技术,从最初的Hive,到SparkSQL,再到Impala,进行了一系列ETL、CDC、多维数据仓库、OLAP的实验。作为一名从业20年以上的DBA,从数据…