Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它可以很方便的提供消息的提示和动作反馈。

有时我们想这样一种控件,我们想他可以想Toast一样显示完成便可以消失,又想在这个信息提示上进行用户反馈。写Toast没有反馈效果,写Dialog只能点击去dismiss它,Snackbar完全可以达到这样的需求。

在谷歌提出 material design 之后,终于推出了 android.support.design 这个官方的material design库,这几天我也简单浏览了下这个库,基本上我们常用的组件都有了,今天的主角Snackbar就在这个库中,因此要想使用SnackBar,首先我们就要引入这个库。

引入这个库的方法很简单,首先找到你app的build gradle文件,引入如下代码:


compile 'com.android.support:design:22.2.0'

如下:

Android-Snackbar用法及源码分析_控件

然后点击文件左上方的Sync Now按钮如下:

Android-Snackbar用法及源码分析_snackbar_02

这时再输入Snackbar,如下:

Android-Snackbar用法及源码分析_控件_03

也就是我们可以使用Snackbar了,可以通过一个简单的实例来认识一下Snackbar,代码如下:


public class MainActivity extends AppCompatActivity {
private TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this.findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(tv, "this is message to show", Snackbar.LENGTH_LONG).
setAction("click", new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText("click over");
}
}).show();

}
});
}
}

创建一个Snackbar需要调用其make方法,传入三个参数,第一个是view,第二个是要显示的信息,第三个是Snackbar显示的时间,其源码如下:


public static Snackbar make(View view, CharSequence text, int duration) {
Snackbar snackbar = new Snackbar(findSuitableParent(view));
snackbar.setText(text);
snackbar.setDuration(duration);
return snackbar;
}

为Snackbar添加一个点击事件的响应,可以调用setAction方法,传入两个参数,第一个是Action的提示内容,第二个是单击事件的监听,其源码如下:


public Snackbar setAction(CharSequence text, final OnClickListener listener) {
TextView tv = this.mView.getActionView();//创建一个TextView响应Action事件
if(!TextUtils.isEmpty(text) && listener != null) {
tv.setVisibility(0);//0表示显示
tv.setText(text);//设置显示信息
tv.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
listener.onClick(view);//为这个TextView设置单击事件监听
Snackbar.this.dismiss();//这个TextView被点击后Snackbar隐藏
}
});
} else {
tv.setVisibility(8);//表示不可见,并不占空间;4表示不可见,但占原来的空间
tv.setOnClickListener((OnClickListener)null);
}

return this;
}

从源码可以看出来,点击Snackbar的Action按钮之后,Snackbar调用了其dismiss方法,隐藏Snackbar。

最后不要忘记调用show方法显示Snackbar,其源码如下:


public void show() {
SnackbarManager.getInstance().show(this.mDuration, this.mManagerCallback);
}

运行实例如下:

Android-Snackbar用法及源码分析_android_04


谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.

Android-Snackbar用法及源码分析_android_05