Snackbar 使用
谷歌在其 2015年的 I/O 大会上发布了一个全新兼容函数库,开发者可以在安卓 2.1(API Level 7)及以上的设备中实现 Material Design 的效果,提供了一系列的控件,主要包括:Snackbar,TextInputLayout,FloatActionButton,TabLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout,BottomSheetBahavior。
在使用 Design Support Library 之前,需要先添加如下依赖。
implementation 'com.android.support:design:27.1.1'
Snackbar
Snackbar 是带有动画效果的快速提示栏,显示在屏幕的底部,用来替代 Toast,基本上继承了 Toast 的属性和方法,和 Toast 最大的不同是 Snackbar 可以带有按钮。当 Snackbar 显示时,用户可以点击按钮执行对应的操作,如果用户没有任何操作,指定事件之后就会自动消失。一个时刻只能有唯一一个 Snackbar,当同时弹出多个消息时,Snackbar 会停止前一个,直接显示后一个,Toast 则可以多个同时出现。
使用
构造方法。
public static Snackbar make(@NonNull View view, @NonNull CharSequence text, @Duration int duration)
public static Snackbar make(@NonNull View view, @StringRes int resId, @Duration int duration)
其中第一个参数是一个 view,用来存放 Snackbar。如果该 View 是 CoordinatorLayout,那么 Snackbar 可以通过右滑消失。
第二个参数可以是一个字符串,也可以是一个字符串的资源 id。
第三个参数是设置时间。你可以设置 LENGTH_INDEFINITE, LENGTH_SHORT, LENGTH_LONG,也可以设置成具体的毫秒数。可以通过 setDuration 修改显示的时间。
常量 | 消失的时间 |
---|---|
LENGTH_INDEFINITE | 手动消失,或者其他 Snackbar 出现 |
LENGTH_SHORT | 短时间显示,然后自动取消 |
LENGTH_LONG | 长时间显示,然后自动取消 |
显示 Snackbar 可以通过 show() 方法。消失有好几种方式,这些方式对应 Snackbar.Callback 中的几个常量。
常量 | 消失的方式 |
---|---|
DISMISS_EVENT_SWIPE | 滑动导致消失 |
DISMISS_EVENT_ACTION | 点击 Action 按钮导致消失 |
DISMISS_EVENT_TIMEOUT | 设置的时间到了导致消失 |
DISMISS_EVENT_MANUAL | 调用 dismiss 方法导致小时 |
DISMISS_EVENT_CONSECUTIVE | 新的 Snackbar 出现导致消失。 |
基本用法
Snackbar.make(activity_design, R.string.app_name, Snackbar.LENGTH_LONG)
.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(DesignActivity.this, "你点击我了", Toast.LENGTH_SHORT).show();
}
}).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);
}
}).setDuration(Snackbar.LENGTH_INDEFINITE).show();
效果
private void showNoramlSnackbar() {
Snackbar.make(coordinatorLayout, "普通的Snackbar", Snackbar.LENGTH_LONG).show();
}
private void showButtonSnackbar() {
Snackbar.make(coordinatorLayout, "带按钮的Snackbar", Snackbar.LENGTH_LONG)
.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(DesignActivity.this, "你点击带按钮的Snackbar", Toast.LENGTH_SHORT).show();
}
}).show();
}
private void showCustomSnackbar() {
Snackbar snackbar = Snackbar.make(coordinatorLayout, "自定义背景字体颜色", Snackbar.LENGTH_LONG)
.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(DesignActivity.this, "你点击自定义背景字体颜色的Snackbar", Toast.LENGTH_SHORT).show();
}
});
View snackbarView = snackbar.getView();
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbarView;
snackbarLayout.setBackgroundColor(0xff0000ff);
((TextView)snackbarView.findViewById(R.id.snackbar_text)).setTextColor(Color.parseColor("#FF0000"));
((Button)snackbarView.findViewById(R.id.snackbar_action)).setTextColor(Color.parseColor("#00FF00"));
snackbar.show();
}
效果.gif