1.前言
- Snackbar是Material Design中的一个控件。可以理解为一个加强版Toast,或一个轻量级的Dialog。
- 相比Toast可以添加点击事件。可以自动消失,也可以侧滑取消(需要在CoordinatorLayout布局)。
- SnackBars 提供了一个轻量级的反馈操作,他们在屏幕的底部显示一条简短的信息,如果是较大的设备就显示在左下角。SnackBar出现在屏幕中所有其他元素的上方,同一时间只能显示一条SnackBar。
- 可以通过它的CallBack来得知Snackbar是显示还是隐藏
- 事实上Snackbar的背景、文字都可以自定义甚至添加图标。但是不建议这么操作,因为必须在代码中实现上述功能。如果非要实现,最好是搞一个封装类。但是干嘛不用PopupWindows或Dialog。
官方使用建议: - 通常 Snackbar 的高度应该仅仅用于容纳所有的文本,而文本应该与执行的操作相关。Snackbar 中不能包含图标,操作只能以文本的形式存在。
- 最多0-1个操作,不包含取消按钮
- 当一个动作发生的时候,应当符合提示框和可用性规则。当有2个或者2个以上的操作出现时,应该使用提示框而不是 Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非 Snackbar。
2.基本使用
2.1添加依赖
implementation 'com.android.support:design:25.3.0'
2.2创建Snackbar并弹出
/**
* 其中的View可以是任何view。snackbar会查找这个view的第一个合适的父view。然后创建一个snackbarView用来显示内容,添加进父view。
* message是要显示的提醒文本。
* duration是时间常量。
* 有三个值:Snackbar.LENGTH_INDEFINITE 永远显示, LENGTH_LONG显示较长时间, LENGTH_SHORT 显示较短时间。
*/
Snackbar.make(View,message,duration)
.show();
2.3设置点击事件
Snackbar.make().setAction(message,click listener);
Snackbar.make().setAction("hi", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
2.4设置callBack回调
在Snackbar弹出和消失时,都会触发一个回调事件
- onDismissed()方法:Snackbar消失的时候触发
- onShown()方法:Snackbar显示的时候触发
Snackbar.make().addCallback(Snackbar.Callback);
public class sna extends Snackbar.Callback {
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}
}
2.5相关设置
//这些方法都可以传入如R.id.的int参数。
snackbar.setText();
snackbar.setActionTextColor(Color.RED);Action文本颜色
snackbar.setDuration(5000);//设置显示时间
3.高级使用
如下的代码,如修改背景颜色,修改提示文本颜色,添加icon,并不建议使用。会造成代码太长,且布局和代码没分开。Snackbar本身就是一种针对操作的轻量级反馈。
3.1背景修改
//先获得SnackbarBaseLayout(继承FrameLayout),然后就可以修改这个view的参数了。
View snackbarBaseView = snackbar.getView();
v.setBackgroundColor();
3.2提醒文本参数修改
//先获得textView对象,然后修改这个textView参数
//id是Snackbar内部定死了的。
TextView tv = (TextView) snackbarBaseView.findViewById(R.id.snackbar_text);
tv.setTextColor();//最好先定义了一个style,然后指定这个style给这个textView
3.3Action的参数设置
//先获得button对象,然后修改参数
Button btn = (Button) snackbarBaseView.findViewById(R.id.snackbar_action);
3.4添加icon,甚至是另外一个button等
//snackbarBaseView本身是一个容器View可以添加很多view进去
View snackbarBaseView = snackbar.getView();
chrView = LayoutInflater.from(context).inflate(int resource, ViewGroup root)
snackbarBaseView.addView(chrView,layoutParams)//添加如ImageView等view进来