Android Snackbar简单解析

article/2025/9/18 17:42:10
偶然间发现android中有Snackbar类,还是有点意思,类似于toast。与toast相比,最明显的区别是:Snackbar只能在屏幕底部显示。其他用法基本与toast相似。

先来张效果图吧,静态图:



大概的用法呢?:

Snackbar.make(btn,"Snackbar 测试",Snackbar.LENGTH_INDEFINITE).show();
//记得引入库:
compile 'com.android.support:design:xx.xx.xx'

接下来我简略翻译下部分源码:

包名
package android.support.design.widget;/*** Snackbars为用户操作提供一个轻量级的反馈,* 他在屏幕底部显示一个简略的消息,* snackbars出现在屏幕上的所有其他要素之上,* 同一时间只会显示一个scankbar,* 在一定时间后他会自动消失,* 如果传递给scankbar的父容器是CoordinatorLayout,则用户可右滑关闭他。* Snackbars可以包含一个动作,当你调用setAction(CharSequence,      android.view.View.OnClickListener)方法时(设置一个文本,并提供一个关于该文本的点击事件。如果设置了,则文本显示在scankbar的内部右侧)* 如果你讲关注snackbar的显示或隐藏事件,你可以设置回调函数监控addCallback(BaseCallback)*/
public final class Snackbar extends BaseTransientBottomBar<Snackbar> {/***      无限期的显示一个Snackbar。意思也就是说这个Snackbar在被调用show()后显示,直到被调用关闭,或者有另一个被显示时才会关闭。**/public static final int LENGTH_INDEFINITE = BaseTransientBottomBar.LENGTH_INDEFINITE;public static final int LENGTH_SHORT = BaseTransientBottomBar.LENGTH_SHORT;public static final int LENGTH_LONG = BaseTransientBottomBar.LENGTH_LONG;/*** Snackbar的回调类.** @see BaseTransientBottomBar#addCallback(BaseCallback)*/public static class Callback extends BaseCallback<Snackbar> {/** 表示Snackbar被滑动关闭.*/public static final int DISMISS_EVENT_SWIPE = BaseCallback.DISMISS_EVENT_SWIPE;/** 表示Snackbar被点击action后关闭.*/public static final int DISMISS_EVENT_ACTION = BaseCallback.DISMISS_EVENT_ACTION;/** 表示Snackbar显示到一定时间后关闭.*/public static final int DISMISS_EVENT_TIMEOUT = BaseCallback.DISMISS_EVENT_TIMEOUT;/** 表示Snackbar被调用dismiss()后关闭.*/public static final int DISMISS_EVENT_MANUAL = BaseCallback.DISMISS_EVENT_MANUAL;/** 表示Snackbar被一个新的Snackbar显示时关闭.*/public static final int DISMISS_EVENT_CONSECUTIVE = BaseCallback.DISMISS_EVENT_CONSECUTIVE;@Overridepublic void onShown(Snackbar sb) {// Stub implementation to make API check happy.}@Overridepublic void onDismissed(Snackbar transientBottomBar, @DismissEvent int event) {// Stub implementation to make API check happy.}}private BaseCallback<Snackbar> mCallback;private Snackbar(ViewGroup parent, View content, ContentViewCallback contentViewCallback) {super(parent, content, contentViewCallback);}/*** 构造一个对象** Snackbar会尝试从给定的容器中向上寻找一个合适的父容器来托管他的view. 他的父容器会被认为是CoordinatorLayout或者是decorView.先找到了其中的某一个就结束查找。* 如果给定的容器中包含CoordinatorLayout布局,那么这个Scankbar将会获得更多的特性,比喻滑动删除scankbar.** @param view     The view to find a parent from.* @param text     The text to show.  Can be formatted text.* @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or {@link*                 #LENGTH_LONG}*/@NonNullpublic static Snackbar make(@NonNull View view, @NonNull CharSequence text,@Duration int duration) {final ViewGroup parent = findSuitableParent(view);if (parent == null) {throw new IllegalArgumentException("No suitable parent found from the given view. "+ "Please provide a valid view.");}final LayoutInflater inflater = LayoutInflater.from(parent.getContext());final SnackbarContentLayout content =(SnackbarContentLayout) inflater.inflate(R.layout.design_layout_snackbar_include, parent, false);final Snackbar snackbar = new Snackbar(parent, content, content);snackbar.setText(text);snackbar.setDuration(duration);return snackbar;}//查找合适的父容器private static ViewGroup findSuitableParent(View view) {ViewGroup fallback = null;do {if (view instanceof CoordinatorLayout) {//如果是CoordinatorLayout// We've found a CoordinatorLayout, use itreturn (ViewGroup) view;} else if (view instanceof FrameLayout) {if (view.getId() == android.R.id.content) {// If we've hit the decor content view, then we didn't find a CoL in the// hierarchy, so use it.return (ViewGroup) view;} else {// It's not the content view but we'll use it as our fallbackfallback = (ViewGroup) view;}}if (view != null) {// Else, we will loop and crawl up the view hierarchy and try to find a parentfinal ViewParent parent = view.getParent();view = parent instanceof View ? (View) parent : null;}} while (view != null);// If we reach here then we didn't find a CoL or a suitable content view so we'll fallbackreturn fallback;}/*** 更新文本。看这意思,是可以给一个正在显示的scankbar更新文本?*/@NonNullpublic Snackbar setText(@NonNull CharSequence message) {final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);final TextView tv = contentLayout.getMessageView();tv.setText(message);return this;}/*** 设置一个带点击动作的文本,以及回调函数。* 点击文本的同时关闭scankbar。* 设置了文本则显示,并设置事件。如果没有设置,则隐藏。看来是已有的布局了* @param text     Text to display for the action* @param listener callback to be invoked when the action is clicked*/@NonNullpublic Snackbar setAction(CharSequence text, final View.OnClickListener listener) {final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);final TextView tv = contentLayout.getActionView();if (TextUtils.isEmpty(text) || listener == null) {tv.setVisibility(View.GONE);tv.setOnClickListener(null);} else {tv.setVisibility(View.VISIBLE);tv.setText(text);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {listener.onClick(view);// Now dismiss the SnackbardispatchDismiss(BaseCallback.DISMISS_EVENT_ACTION);}});}return this;}/*** 设置点击动作的文本颜色*/@NonNullpublic Snackbar setActionTextColor(ColorStateList colors) {final SnackbarContentLayout contentLayout = (SnackbarContentLayout) mView.getChildAt(0);final TextView tv = contentLayout.getActionView();tv.setTextColor(colors);return this;}/*** 设置回调函数,来监控scankbar的显示与隐藏动作. * 什么?这个方法过时了?* 请使用addCallback(BaseCallback)和removeCallback(BaseCallback)函数.** @param callback Callback to notify when transient bottom bar events occur.* @deprecated Use {@link #addCallback(BaseCallback)}* @see Callback* @see #addCallback(BaseCallback)* @see #removeCallback(BaseCallback)*/@Deprecated@NonNullpublic Snackbar setCallback(Callback callback) {// The logic in this method emulates what we had before support for multiple// registered callbacks.if (mCallback != null) {removeCallback(mCallback);}if (callback != null) {addCallback(callback);}// Update the deprecated field so that we can remove the passed callback the next// time we're calledmCallback = callback;return this;}...
}


搜嘎,简略的读下源码后发现这个类很简单,那么更奇葩的用法来了:

@Override
public void onClick(View v) {Snackbar sb = Snackbar.make(v,"aa",Snackbar.LENGTH_LONG).setAction("是吗?", new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击了"是吗?"字符串操作}}).setActionTextColor(Color.RED).setText("aa是不够的").addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {@Overridepublic void onDismissed(Snackbar transientBottomBar, int event) {super.onDismissed(transientBottomBar, event);Log.d("MainActivity","onDismissed");}@Overridepublic void onShown(Snackbar transientBottomBar) {super.onShown(transientBottomBar);Log.d("MainActivity","onShown");}});sb.show();//sb.isShown();//sb.dismiss();}



注意看,Snackbar sb = make(v,"aa",......
第一个参数我给的v,就是当前点击的按钮,什么情况?
源码中说了,他会从这个view起想上查找一个合适的父容器,直到找到CoordinatorLayout或者decorView。先找到了其中的某一个就结束查找。如果找到了CoordinatorLayout,则可以有右滑删除功能哦。


如果想设置显示的内容,和整个背景色,也很简单。自己添加布局就可以了,跟toast一样,没多大意义不说了。




这么简单,不贴demo了。动手练习。





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

相关文章

android Snackbar新控件解析

Dialog和Toast&#xff0c;我们在日常的开发中一定非常熟悉&#xff0c;常常被用来作为Android应用内提示性信息的两种展示方式。然而Google在Design包中又提供了一种新的选择&#xff0c;那就是Snackbar。今天主要介绍Snackbar新控件的使用&#xff0c;以及三种提示信息展示方…

android开发之SnackBar的使用

SnackBar是一个类似于Toast的东西&#xff0c;它也有显示时长&#xff0c;但是比Toast更加灵活&#xff0c;同时&#xff0c;我们还可以给SnackBar设置点击事件&#xff0c;那么我们今天就来看看怎么用吧&#xff01; 先来一张效果图&#xff1a; 这种效果大家可能在一些App中…

Snackbar-Android M新控件

概述 查看官方API Snackbar 是 Android design support library 中的另一个组件。使用 Snackbar&#xff0c;可以在屏幕底部快速的显示一条消息&#xff0c;大体与 Toast 相同&#xff0c;但多了几分灵活性&#xff1a; 一小段时间之后、或者用户与屏幕触发交互&#xff0c;S…

Android Snackbar使用方法及小技巧-design

Snackbar和Toast相似&#xff0c;都是为了给用户提供交互信息&#xff0c;Snackbar是固定在底部的&#xff0c;显示时从下往上滑出 要使用Snackbar&#xff0c;需要在项目的build.gradle中添加依赖 dependencies {compile com.android.support:design:23.4.0 } Snackbar的使用…

Android 快别用Toast了,来试试Snackbar

&#x1f525; 应用场景 Toast提示默认显示在界面底部&#xff0c;使用Toast.setGravity()将提示显示在中间&#xff0c;如下&#xff1a; Toast toast Toast.makeText(this, str, Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();运行在在Android …

Android---简易Snackbar

目录 Snackbar 简介 Snackbar 特性 完整Demo Snackbar 简介 Snackbar 是 Android5.0 新特性---Material Design 中的一个控件&#xff0c;用来代替 Toast。Snackbar 就是一个类似 Toast 的快速弹出消息提示的控件&#xff0c;手机上显示在底部&#xff0c;大屏幕设备显示在左…

Android Snackbar基本使用

概述 Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件&#xff0c;用来代替 Toast &#xff0c;Snackbar与Toast的主要区别是&#xff1a;Snackbar可以滑动退出&#xff0c;也可以处理用户交互&#xff08;点击&#xff09;事件。 样式 使用 Snackbar需要配…

Android提醒微技巧,你真的了解Dialog、Toast和Snackbar吗?

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/51336415 本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每天都有文章更新。 今天给大家带来一篇简单易懂的微技巧文章&#xff0c;并没…

Android开发——Snackbar使用详解

Snackbar是Android支持库中用于显示简单消息并且提供和用户的一个简单操作的一种弹出式提醒。当使用Snackbar时&#xff0c;提示会出现在消息最底部&#xff0c;通常含有一段信息和一个可点击的按钮。下图是Gmail中删除一封邮件时弹出的Snackbar&#xff1a; 在上图中&#xf…

Android Snackbar的使用

在项目中肯定有不少地方用到Toast&#xff0c;但是在项目各种各样的需求上&#xff0c;Toast已经不能满足我们的需求了。 其实google在Android 5.0的时候就推出了Snackbar&#xff0c;它算是Toast的一个进阶控件。 它是Material Design中的一个控件&#xff0c;与Toast的最大区…

Snackbar的使用和顶部Snackbar实现

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

SnackBar 简单使用

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

MaterialDesign之Snackbar学习笔记

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

Snackbar使用详解

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

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

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

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

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

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

一、安装规划1. 选择安装介质 HAWQ的安装介质有两种选择&#xff0c;一是下载源码手工编译&#xff0c;二是使用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数据库&#xff0c;为一个销售订单系统建立数据仓库。本篇说明示例的业务场景、数据仓库架构、实验环境、源和目标库的建立过程、测试数据和日期维度的生成。后面陆续进行初始数据装载、定期数据装载、调度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&#xff0c;全称Hadoop With Query&#xff08;带查询Hadoop&#xff09;。HAWQ使企业能够获益于经过锤炼的基于MPP的分析功能及其查询性能&#xff0c;同时利用Hadoop堆栈。HAWQ是一个Hadoop原生大规模…