序
SnackBar,中文名称:快餐店(本Android狗常去地点之一)
Toast,中文名称:吐司
从名字上看,SnackBar就高级一点(纯属瞎聊),有的人认为SnackBar会取代Toast,Toast渐渐沦为了程序员测试的“工具”,
毕竟从直观上SnackBar颜值确实好很多。但是我觉得两者各有所长吧。这篇文章主要介绍SnackBar的基础使用,以及和Toast的一些对比。
1.SnackBar的特性
先从源码的注释来了解下:
Snackbars provide lightweight feedback about an operation. They show a brief message at thebottom of the screen on mobile and lower left on larger devices. Snackbars appear above all other elements on screen and only one can be displayed at a time.
简译:SnackBars提供了一个轻量级的反馈操作。他们在屏幕的底部显示一条简短的信息,如果是较大的设备就显示在左下角。SnackBar出现在屏幕中所有其他元素的上方,同一时间仅仅只有一条SnackBar。
从上面这句话我们可以知道:
1.SnackBar和Toast的用途一样,都是用来提示用户操作后的结果的。
2.SnackBar显示时位置一般是在屏幕底部,较大的设备就显示在左下角。
3.SnackBar同一时间只有一条
They automatically disappear after a timeout or after user interaction elsewhere on the screen, particularly after interactions that summon a new surface or activity. Snackbars can be swipedoff screen.
简译:在超时或者用户在屏幕上完成了交互的时候SnackBar会自动消失,特别是在召唤了新的表层(意思是SnackBar本来是最外层的,然后在SnackBar上又新添加了一层)或者Activity的时候。SnackBar能在屏幕上侧滑。
从上面这句话我们可以知道:
1.SnackBar可以自动消失,也可以手动取消(在完成某个操作的时候)
2.在Activity结束的时候,SnackBar会消失,这点Toast不会
3.SncakBar能支持侧滑,侧滑干嘛呢?当然是删除,之后会做介绍
Snackbars can contain an action which is set via {@link#setAction(CharSequence, android.view.View.OnClickListener)}.
简译:SnackBar能包含一个action使用setAction方法
To be notified when a snackbar has been shown or dismissed, you can provide a {@linkCallback} via {@link#setCallback(Callback)}
简译:你可以用CallBack来得知Snackbar是显示还是隐藏
2.Sncakbar的简单使用
看了那么文字是不是很无趣?别急接下来先看看效果:
![](https://i-blog.csdnimg.cn/blog_migrate/a720b87400cddb073427c6995ef4f680.webp?x-image-process=image/format,png)
实现很简单就是在一个Button的单击事件中,显示一个SnackBar,关键代码:
Snackbar.make(btnShowSnackBar,"欢迎来到Android快餐店",Snackbar.LENGTH_SHORT).show();
这货的使用方式和Toast几乎一毛一样,唯一的不同就是第一个参数。
第一个参数:传入一个View对象
第二个参数:传入一段字符
第三个参数:显示的时长
最后通过show()方法来展示。
3.SnackBar的显示位置
那么现在问题来了,明明我给的是一个Button,他不在Button上显示,为何跑屏幕下方去了呢?
这时候就要去源码看看它是怎么实现的:
首先在make()方法中找到这样一句话:
Snackbarsnackbar =newSnackbar(findSuitableParent(view));
这句话告诉我们,我们传入的view经过了findSuitableParent()方法的包装。
这里就不贴该方法的源码了,这个方法主要的作用是:
1.当传入的View不为空时,如果我们在布局中发现了CoordinatorLayout布局,那么View就是CoordinatorLayout;
2.如果没有CoordinatorLayout布局,我们就先找到一个id为android.R.id.content的FrameLayout(这个布局是最底层的根布局),将View设置为该FrameLayout;
3.其他情况下就使用View的Parent布局一直到这个View不为空。
这样我们就可以解释清楚SnackBar的显示位置是如何确定的了。
口说无凭我们来验证下:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="300dp">
<Button
android:id="@+id/btnShowSnackBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/activity_horizontal_margin"
android:text="显示SnackBar"/>
</android.support.design.widget.CoordinatorLayout>
仅仅就是在Button外包裹了一层CoordinatorLayout(继承于FrameLayout)。然而效果变成了:
![](https://i-blog.csdnimg.cn/blog_migrate/f1c37fc6482185961884e9b34be78c0f.webp?x-image-process=image/format,png)
很明显可以看到显示的位置变了,这也验证了我们的想法。
4.Snackbar的显示时常
有三种状态:
Snackbar.LENGTH_SHORT// 短时间显示,然后自动取消
Snackbar.LENGTH_LONG// 长时间显示,然后自动取消
Snackbar.LENGTH_INDEFINITE// 不消失显示,除非手动取消
这时候我的强迫症犯了,想知道具体的时间,记得有个CallBack方法,接下来就来试试.
5.SnackBar的callBack方法
在SnackBar的回调方法callBack中的onShow()和onDismissed()方法中,记录下当前的系统时间,然后比较差值,得出显示的时长。
核心代码如下:
Snackbar.make(btnShowSnackBar,"欢迎来到Android快餐店",Snackbar.LENGTH_SHORT).setCallback(newSnackbar.Callback() {
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
showTime=System.currentTimeMillis();//显示的时间
}
@Override
public voidonDismissed(Snackbar snackbar,int event) {
super.onDismissed(snackbar, event);
dismissTime=System.currentTimeMillis();//消失的时间
tvTime.setText(""+(dismissTime-showTime));//用一个TextView显示时间的差值
}
}).show();
测试结果:
Snackbar.LENGTH_SHORT:1777左右,意思就是1.8s的样子
Snackbar.LENGTH_LONG:3031-3034, 大概就是3s的样子
上面我们知道了callBack中有个onshow()和onDismissed()两个重要的方法,一个是显示的时候调用,一个是消失的时候调用,这都很容易理解,下面详细说下onDismissed()中的event事件有哪些:
1.滑动消失的时候调用
/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE=0;
2.点击Action消失的时候调用
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final intDISMISS_EVENT_ACTION=1;
3.超时消失的时候调用
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final intDISMISS_EVENT_TIMEOUT=2;
4.手动调用dismiss()方法时调用
/** Indicates that the Snackbar was dismissed via a call to {@link#dismiss()}.*/
public static final intDISMISS_EVENT_MANUAL=3;
5.一个新的SnackBar出现的时候调用
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final intDISMISS_EVENT_CONSECUTIVE=4;
使用也很简单:
if(event==DISMISS_EVENT_SWIPE){
//滑动消失后的逻辑
}
6.给SnackBar添加Action事件
先看看效果:
![](https://i-blog.csdnimg.cn/blog_migrate/44e4b2d38fa57cabf25a1e29755ead03.webp?x-image-process=image/format,png)
Snackbar.make(btnShowSnackBar,"欢迎来到Android快餐店",Snackbar.LENGTH_LONG).setAction("点餐",newView.OnClickListener() {
@Override
public void onClick(View v) {
tvTime.setText("点餐成功");
}
}).show();
使用起来很简单,感觉就是一个Button。
第一个参数是一段字符串
第二个参数是一个onClickListener()接口
7.修改SnackBar颜色
我们知道不同的APP有不同的主题,如果我们字体的颜色和背影一直是这个样式,难免有点不搭。
在它自带的方法中我们找到了这个:setActionTextColor(Color.YELLOW) .使用之后效果如下。
![](https://i-blog.csdnimg.cn/blog_migrate/59b9e56a8241fd4f7b11c200442330d1.webp?x-image-process=image/format,png)
-。- 然后我就找不到其他方法了,这时候怎么办?这是之前看到的一篇文章,写得很不错,里面的“花式SnackBar”相信可以满足你的需求
8.其他系统自带方法
1.设置显示文字的内容,如果在make方法之后设置,会覆盖make方法中的文字
setText(int resId|CharSequencemessage)
2.设置显示的时长,只能3选一
setDuration(int duration)
3.设置SnackBar手动消失
dismiss()
4.设置SnackBar显示
show()