Android消息提示_Snackbar详解

Snackbar是Android5.0后引入的Design包提供的Material Design控件, 是用于消息提醒的View, 和Toast的作用以及用法基本一致. 本文介绍了全部的方法.

参考文档:

下方黑色的即为Snackbar通知效果

区别:

  1. Snackbar可以自动消失也可以无限期显示, 而Toast虽然可以手动取消, 但是无法一直显示
  2. Snackbar类似dialog, 生命周期跟随当前Activity, 而Toast跟当前Activity没有关系

示例

1
Snackbar.make(mEtPetName, "请输入昵称", Snackbar.LENGTH_SHORT).show();

API介绍

创建

1
2
3
4
5
6
7
Snackbar make (View view, // 这个View对象用于查看父容器的位置. 你随便穿个屏幕上的View控件就行
CharSequence text,
int duration)
Snackbar make (View view,
int resId, // 字符串的资源id
int duration)

duration参数支持三个值:

  1. LENGTH_LONG 长时间显示
  2. LENGTH_SHORT 短时间显示
  3. LENGTH_INDEFINITE 一直显示

显示和隐藏

是否正在显示

1
boolean isShown ()

显示

1
2
3
void show () // 是否正在显示中
boolean isShownOrQueued () // 是否正在显示, 或者等待显示. Snackbar一次在屏幕只能显示一条. 所以有等待的状态

关闭

1
void dismiss ()

显示时间

创建的时候就指定的时间

1
2
3
Snackbar setDuration (int duration)
int getDuration ()

显示内容

创建的时候就指定的显示内容

1
2
3
Snackbar setText (CharSequence message)
Snackbar setText (int resId)

显示状态回调

当Snackbar显示的状态改变时回调

1
Snackbar setCallback (Snackbar.Callback callback)

Callback

该抽象回调类有两个抽象方法需要重写

显示状态回调方法

1
void onShown (Snackbar snackbar)

关闭状态回调方法

1
2
void onDismissed (Snackbar snackbar,
int event)

可以看到关闭状态的回调方法多了一个参数. 该参数代表Snackbar关闭是因为什么事件导致:

  1. DISMISS_EVENT_SWIPE 因为刷新屏幕
  2. DISMISS_EVENT_ACTION 因为点击动作关闭
  3. DISMISS_EVENT_TIMEOUT 因为超时关闭
  4. DISMISS_EVENT_MANUAL 因为调用dismiss()方法关闭
  5. DISMISS_EVENT_CONSECUTIVE 因为显示下个Snackbar关闭

得到View

得到Snackbar的View对象. 用于修改Snackbar的样式. 该方法我将在后面重点讲解.

1
View getView ()

设置动作

默认Snackbar只显示文字消息. 但是通过以下方法可以给Snackbar右侧增加一个文本. 并且可以给该文本增加点击事件.

1
2
3
4
5
Snackbar setAction (int resId, // 字符串的资源id
View.OnClickListener listener)
Snackbar setAction (CharSequence text, // 字符串
View.OnClickListener listener)

设置颜色

1
2
3
Snackbar setActionTextColor (ColorStateList colors)
Snackbar setActionTextColor (int color)

自定义Snackbar

官方并没有给Snackbar直接提供样式的修改方法. 不过我们可以通过getView()方法得到他的View对象进行更加自定义的修改方式.

Snackbar的布局实际上就是一个容器LinearLayout里面有TextView(ID: snackbar_text)和Button(ID: snackbar_action)

我们可以直接操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 创建Snackbar实例
Snackbar snackbar = Snackbar.make(mEtPetName, "请输入昵称", Snackbar.LENGTH_SHORT);
// 得到View对象
View snackbarView = snackbar.getView();
// 背景颜色
snackbarView.setBackgroundColor(getResources().getColor(R.color.background));
// 设置文字颜色
TextView text = (TextView) snackbarView.findViewById(R.id.snackbar_text);
text.setTextColor(getResources().getColor(R.color.colorAccent));
// 显示Snackbar
snackbar.show();