Android-Snackbar

Snackbar基本介绍

Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用,功能类似于Toast的一种轻量级反馈消息,Snackbar是从底部弹出消息的。
`

使用,这里的view可以填你的根布局,或者findViewById(android.R.id.content)

1
2
3
Snackbar.make(view, message_text, duration)
.setAction(action_text, click_listener)
.show();


make()方法是生成Snackbar的。Snackbar需要一个控件容器view用来容纳,官方推荐使用CoordinatorLayout来确保Snackbar和其他组件的交互,比如滑动取消Snackbar、Snackbar出现时FloatingActionButton上移。显示时间duration有三种类型LENGTH_SHORT、LENGTH_LONG和LENGTH_INDEFINITE。
setAction()方法可设置Snackbar右侧按钮,增加进行交互事件。如果不使用setAction()则只显示左侧message。
1
2
3
4
5
6
Snackbar.make(coordinatorLayout,"这是massage", Snackbar.LENGTH_LONG).setAction("这是action", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"你点击了action",Toast.LENGTH_SHORT).show();
}
}).show();

自定义Snackbar

Snackbar和Toast的默认样式都很单一,但是有时我们希望把不同类型信息区别显示,从而使用户更容易注意到提示信息。所以使Snackbar变色是一个好主意。下面的代码就可以修改他的背景颜色,setActionTextColor()这个方法可以修改Action颜色

1
2
3
4
5
6
7
public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {
View view = snackbar.getView();//获取Snackbar的view
if(view!=null){
view.setBackgroundColor(backgroundColor);//修改view的背景色
((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);//获取Snackbar的message控件,修改字体颜色
}
}

显示和隐藏时的回调

在显示Snackbar或隐藏Snackbar时需要做一些事情,这时候就要用到Callback了,通过addCallback方法,以前有个setCallback现在过时了,实现Snackbar.Callback这个抽象类,里面有onDismissed()和onShown()两个抽象方法,onShown()是显示的时候调用,onDismissed()在隐藏的时候调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Snackbar.make(view, "我就是Snackbar!", Snackbar.LENGTH_LONG).setAction("Action", new View.OnClickListener() {                            
@Override
public void onClick(View v) {
}
})
.addCallback(new Snackbar.Callback(){
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}

@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
}).show();

相关属性设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Snackbar snackbar = Snackbar.make(coordinatorLayout, "Action 被点击", Snackbar.LENGTH_SHORT);
snackbar.setText("动态文本");//动态设置文本显示内容
snackbar.setActionTextColor(Color.RED);//动态设置Action文本的颜色
snackbar.setDuration(5000);//动态设置显示时间

View snackbarView = snackbar.getView();//获取Snackbar显示的View对象
//获取显示文本View,并设置其显示颜色
((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.BLUE);
//获取Action文本View,并设置其显示颜色
((TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(Color.BLUE);
//设置Snackbar的背景色
snackbarView.setBackgroundColor(Color.GREEN);

//设置Snackbar显示的位置
ViewGroup.LayoutParams params = snackbarView.getLayoutParams();
CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(params.width, params.height);
layoutParams.gravity = Gravity.CENTER_VERTICAL;//垂直居中
snackbarView.setLayoutParams(layoutParams);

Snackbar与Dialog和Toast的比较

Dialog
模态对话框。也就说,此刻该对话框中的内容获取了焦点,想要操作对话框以外的功能,必须先对该对话框进行响应。
应用场景:对于删除确认、版本更新等重要性提示信息,需要用户做出选择的情况下,使用Dialog。

Toast
非模态提示框。也就说提示框的显示并不影响我们对其他地方的操作,Toast无法手动控制隐藏,需要设置Toast的显示时长,一旦显示时间结束,Toast会自动消失。如果多次点击并显示Toast,就会出现Toast重复创建并显示,给用户造成一种Toast长时间不隐藏的幻觉。
应用场景:对于无网络提示、删除成功、发布操作完成等这类不重要的提示性信息,使用Toast;

Snackbar
Snackbar和Toast比较相似,但是用途更加广泛,并且它是可以和用户进行交互的。Snackbar使用一个动画效果从屏幕的底部弹出来,过一段时间后也会自动消失。
应用场景:删除操作时,弹出Snackbar用于确认删除操作;消息发送失败时,弹出Snackbar,用于重新发送操作;当然重要的是与MD组件相结合,用户体验效果更佳。