Design库-SnackBar属性详解

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的简单使用

看了那么文字是不是很无趣?别急接下来先看看效果:


实现很简单就是在一个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)。然而效果变成了:



很明显可以看到显示的位置变了,这也验证了我们的想法。


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事件

先看看效果:



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) .使用之后效果如下。



-。- 然后我就找不到其他方法了,这时候怎么办?这是之前看到的一篇文章,写得很不错,里面的“花式SnackBar”相信可以满足你的需求

作者:简名《没时间解释了,快使用SnackBar..》


8.其他系统自带方法

1.设置显示文字的内容,如果在make方法之后设置,会覆盖make方法中的文字

setText(int resId|CharSequencemessage)

2.设置显示的时长,只能3选一

setDuration(int duration)

3.设置SnackBar手动消失

dismiss()

4.设置SnackBar显示

show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值