Snackbar是Android支持库中用于显示简单消息并且提供和用户的一个简单操作的一种弹出式提醒。当使用Snackbar时,提示会出现在消息最底部,通常含有一段信息和一个可点击的按钮。下图是Gmail中删除一封邮件时弹出的Snackbar:
在上图中,最下方的黑色区域,包含左边文字和右边”撤销”字样的就是Snackbar。Snackbar在显示一段时间后就会自动消失。同样作为消息提示,Snackbar相比于Toast而言,增加了一个用户操作,并且在同时弹出多个消息时,Snackbar会停止前一个,直接显示后一个,也就是说只能执行一个Snackbar,而Toast则不然,如果不做特殊处理,那么同时可以有多个Toast出现;Snackbar相比于Dialog,操作更少,因为只有一个用户操作的接口,而Dialog最多可以设置三个,另外Snackbar的出现并不影响用户的继续操作,而Dialog则必须需要用户做出响应,所以相比Dialog,Snackbar更轻量。
static Snackbar make(View view, CharSequence text, int duration)
static Snackbar make(View view, int resId, int duration)
如果父布局是一个CoordinatorLayout,那么Snackbar还会有别的一些特性:可以滑动消除;并且如果有FloatingActionButton时,会将FloatingActionButton上移,而不会挡住Snackbar的显示。
在创建了一个Snackbar对象后,可以调用一些set**方法进行设置,其中setAction()方法用于设置右侧的文字显示以及点击事件,setCallback()方法用于设置一个状态回调,在Snackbar显示和消失的时候会触发方法。下面是一段创建Snackbar的代码:
Snackbar.make(v, "点击了EmptyView", Snackbar.LENGTH_SHORT).setAction("取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(EmptyActivity.this, "删除成功",Toast.LENGTH_SHORT).show();
}
}).show();
内容模仿上面的Gmail例子,并且给“撤销”一个点击事件,只是简单的显示一个Toast。Activity的根布局是一个RelativeLayout,并且下部有一个FloatingActionButton,在Snackbar出现后,可以看到Snackbar遮挡了FlaotingActionButton的一部分,具体效果如下:
在父布局不是CoordinatorLayout的情况下,如果有FloaingActionButton,那么弹出的Snackbar会遮挡FloatingActionButton,为了解决这个问题,可以将父布局改成CoordinatorLayout,并且这会带来一个新特性,就是Snackbar可以通过右滑消失。代码一样,只是布局不同。直接看效果图:
Snackbar显示只有一种方式,那就是调用show()方法,
消失有几种方式:1.时间到了自动消失、2.点击了右侧按钮消失、3.新的Snackbar出现导致旧的Snackbar消失、4.滑动消失或者通过调用dismiss()消失
这些方式分别对应于Snackbar.Callback中的几个常量值。
-DISMISS_EVENT_ACTION:点击了右侧按钮导致消失
- DISMISS_EVENT_CONSECUTIVE:新的Snackbar出现导致旧的消失
- DISMISS_EVENT_MANUAL:调用了dismiss方法导致消失
- DISMISS_EVENT_SWIPE:滑动导致消失
- DISMISS_EVENT_TIMEOUT:设置的显示时间到了导致消失
Callback有两个方法:
void onDismissed(Snackbar snackbar, int event)
void onShown(Snackbar snackbar)
其中onShown在Snackbar可见时调用,onDismissed在Snackbar准备消失时调用。一般我们可以在onDismissed方法中正在处理我们所需要的操作,比如删除一封邮件,那么如果是点击了“撤销”按钮,
Snackbar.make(v, "点击触发Snackbar", Snackbar.LENGTH_SHORT).setAction("取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}) .setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
switch (event) {
case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE:
Toast.makeText(EmptyActivity.this, "新的Snackbar出现导致旧的消失 ", Toast.LENGTH_SHORT).show();
case Snackbar.Callback.DISMISS_EVENT_MANUAL:
Toast.makeText(EmptyActivity.this, "调用了dismiss方法导致消失", Toast.LENGTH_SHORT).show();
case Snackbar.Callback.DISMISS_EVENT_SWIPE:
Toast.makeText(EmptyActivity.this, "滑动导致消失", Toast.LENGTH_SHORT).show();
case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
Toast.makeText(EmptyActivity.this, "设置的显示时间到了导致消失 ", Toast.LENGTH_SHORT).show();
break;
case Snackbar.Callback.DISMISS_EVENT_ACTION:
Toast.makeText(EmptyActivity.this, "点击了右侧按钮导致消失 ", Toast.LENGTH_SHORT).show();
break;
}
}
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
Log.e(TAG,"onShown");
}
}).show();
上述代码在onDismissed中根据效果如下:
参考源码:https://blog.csdn.net/qq_19431333/article/details/52862348