Android Snackbar控件

article/2025/9/17 18:00:04

1. Snackbar类

Snackbar是5.0版本出现的控件,类似于Toast,显示在屏幕的底部,包含文字信息与一个可选的操作按钮。需要添加Design依赖库,并且使用Theme.AppCompat主题。
这里写图片描述

2. 创建Snackbar类

Snackbar利用静态方法make()来创建实例

public static Snackbar make(@NonNull View view, @StringRes int resId, @Duration int duration) {return make(view, view.getResources().getText(resId), duration);
}public 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;
}

创建Snackbar实例,需要寻找合适的父视图,优先选择CoordinatorLayout作为父视图。

private static ViewGroup findSuitableParent(View view) {ViewGroup fallback = null;do {if (view instanceof 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;
}

SnackbarContentLayout继承LinearLayout,并实现了BaseTransientBottomBar.ContentViewCallback,包含一个TextViewButton
design_layout_snackbar_include.xml文件,

<viewxmlns:android="http://schemas.android.com/apk/res/android"class="android.support.design.internal.SnackbarContentLayout"android:theme="@style/ThemeOverlay.AppCompat.Dark"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"><TextViewandroid:id="@+id/snackbar_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:paddingTop="@dimen/design_snackbar_padding_vertical"android:paddingBottom="@dimen/design_snackbar_padding_vertical"android:paddingLeft="@dimen/design_snackbar_padding_horizontal"android:paddingRight="@dimen/design_snackbar_padding_horizontal"android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"android:maxLines="@integer/design_snackbar_text_max_lines"android:layout_gravity="center_vertical|left|start"android:ellipsize="end"android:textAlignment="viewStart"/><Buttonandroid:id="@+id/snackbar_action"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"android:layout_gravity="center_vertical|right|end"android:minWidth="48dp"android:visibility="gone"android:textColor="?attr/colorAccent"style="?attr/borderlessButtonStyle"/></view>

3. Snackbar设置

Snackbar可以设置文本和按钮

public Snackbar setText(@NonNull CharSequence message)
public Snackbar setText(@StringRes int resId)
public Snackbar setAction(@StringRes int resId, View.OnClickListener listener)
public Snackbar setAction(CharSequence text, final View.OnClickListener listener)
public Snackbar setActionTextColor(ColorStateList colors)
public Snackbar setActionTextColor(@ColorInt int color)

Snackbar可以监听视图

addCallback(new Snackbar.Callback(){@Overridepublic void onShown(Snackbar sb) {}@Overridepublic void onDismissed(Snackbar transientBottomBar, int event) {}
})

Dismissevent有下面五种情况

  • DISMISS_EVENT_SWIPE,向右滑动消失,只有父视图是CoordinatorLayout情况下才会发生
  • DISMISS_EVENT_ACTION,点击右侧按钮消失
  • DISMISS_EVENT_TIMEOUT,设置的显示时间到了消失
  • DISMISS_EVENT_MANUAL,调用Snackbardismiss方法消失
  • DISMISS_EVENT_CONSECUTIVE,新的Snackbar出现导致旧的消失

4. SnackbarManager类

SnackbarManager用来管理Snackbar控件的状态。
Snackbarshow()方法,会调用SnackbarManagershow(int, Callback)方法,而mManagerCallback会回调SnackbarshowView()hideView(int)方法。

static {sHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {@Overridepublic boolean handleMessage(Message message) {switch (message.what) {case MSG_SHOW:((BaseTransientBottomBar) message.obj).showView();return true;case MSG_DISMISS:((BaseTransientBottomBar) message.obj).hideView(message.arg1);return true;}return false;}});
}final SnackbarManager.Callback mManagerCallback = new SnackbarManager.Callback() {@Overridepublic void show() {sHandler.sendMessage(sHandler.obtainMessage(MSG_SHOW, BaseTransientBottomBar.this));}@Overridepublic void dismiss(int event) {sHandler.sendMessage(sHandler.obtainMessage(MSG_DISMISS, event, 0,BaseTransientBottomBar.this));}
};public void show() {SnackbarManager.getInstance().show(mDuration, mManagerCallback);
}

SnackbarManager内部包含两个记录mCurrentSnackbarmNextSnackbar。在SnackbarManagershow(int, Callback)方法中,

  • 查看是否是当前Snackbar,如果是,更新超时时间,结束。
  • 查看是否是NextSnackbar,如果是,更新数据,如果不是创建新的NextSnackbar
  • 取消当前Snackbar或者显示NextSnackbar

show(int, Callback)方法

public void show(int duration, Callback callback) {synchronized (mLock) {if (isCurrentSnackbarLocked(callback)) {// 如果是当前Snackbar,更新duration和超时提示mCurrentSnackbar.duration = duration;mHandler.removeCallbacksAndMessages(mCurrentSnackbar);scheduleTimeoutLocked(mCurrentSnackbar);return;} else if (isNextSnackbarLocked(callback)) {// 如果是NextSnackbar,更新durationmNextSnackbar.duration = duration;} else {// 否则就创建新的NextSnackbarmNextSnackbar = new SnackbarRecord(duration, callback);}if (mCurrentSnackbar != null && cancelSnackbarLocked(mCurrentSnackbar,Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE)) {// 如果当前Snackbar存在,取消显示当前Snackbar                return;} else {                mCurrentSnackbar = null;// 如果当前Snackbar不存在,显示NextSnackbarshowNextSnackbarLocked();}}
}// 取消显示当前Snackbar,调用callback的dismiss(DISMISS_EVENT_CONSECUTIVE)方法
private boolean cancelSnackbarLocked(SnackbarRecord record, int event) {final Callback callback = record.callback.get();if (callback != null) {// Make sure we remove any timeouts for the SnackbarRecordmHandler.removeCallbacksAndMessages(record);callback.dismiss(event);return true;}return false;
}private boolean isCurrentSnackbarLocked(Callback callback) {return mCurrentSnackbar != null && mCurrentSnackbar.isSnackbar(callback);
}private boolean isNextSnackbarLocked(Callback callback) {return mNextSnackbar != null && mNextSnackbar.isSnackbar(callback);
}// 更新超时提示
private void scheduleTimeoutLocked(SnackbarRecord r) {if (r.duration == Snackbar.LENGTH_INDEFINITE) {// If we're set to indefinite, we don't want to set a timeoutreturn;}int durationMs = LONG_DURATION_MS;if (r.duration > 0) {durationMs = r.duration;} else if (r.duration == Snackbar.LENGTH_SHORT) {durationMs = SHORT_DURATION_MS;}mHandler.removeCallbacksAndMessages(r);mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_TIMEOUT, r), durationMs);
}// 显示NextSnackbar,调用callback的show方法
private void showNextSnackbarLocked() {if (mNextSnackbar != null) {mCurrentSnackbar = mNextSnackbar;mNextSnackbar = null;final Callback callback = mCurrentSnackbar.callback.get();if (callback != null) {callback.show();} else {// The callback doesn't exist any more, clear out the SnackbarmCurrentSnackbar = null;}}
}

SnackbarshowView()会调用onViewShown()hideView(int)会调用onViewHidden(int)

final void showView() {... ...if (shouldAnimate()) {// If animations are enabled, animate it inanimateViewIn();} else {// Else if anims are disabled just call back nowonViewShown();}... ...
}final void hideView(@BaseCallback.DismissEvent final int event) {if (shouldAnimate() && mView.getVisibility() == View.VISIBLE) {animateViewOut(event);} else {// If anims are disabled or the view isn't visible, just call back nowonViewHidden(event);}
}void onViewShown() {SnackbarManager.getInstance().onShown(mManagerCallback);
}void onViewHidden(int event) {    SnackbarManager.getInstance().onDismissed(mManagerCallback);
}

SnackbarManageronShown(Callback)onDismissed(Callback)方法。

public void onShown(Callback callback) {synchronized (mLock) {if (isCurrentSnackbarLocked(callback)) {scheduleTimeoutLocked(mCurrentSnackbar);}}
}public void onDismissed(Callback callback) {synchronized (mLock) {if (isCurrentSnackbarLocked(callback)) {// If the callback is from a Snackbar currently show, remove it and show a new onemCurrentSnackbar = null;if (mNextSnackbar != null) {showNextSnackbarLocked();}}}
}

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

相关文章

Android Snackbar简单解析

偶然间发现android中有Snackbar类&#xff0c;还是有点意思&#xff0c;类似于toast。与toast相比&#xff0c;最明显的区别是:Snackbar只能在屏幕底部显示。其他用法基本与toast相似。 先来张效果图吧&#xff0c;静态图&#xff1a; 大概的用法呢&#xff1f;&#xff1a; S…

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 如果服务器重启了,…