Snackbar

  Snackbar显示在屏幕的底部,包含了一个文字信息与一个可选的操作按钮。它在指定时间结束之后会自动消失。另外,配合CoordinatorLayout使用,还可以在超时之前将它滑动删除。Snackbar是Android 5.0的新特性--Material Design中的一个控件,用来代替Toast。Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也可以处理用户交互(点击)事件。

SnackBar的特性

  • Snackbar会在超时之后自动消失;
  • 可以在屏幕上滑动关闭;
  • 出现时不会阻碍用户在屏幕上的输入;
  • 屏幕上同时最多只能显示一个Snackbar;
  • 如果在屏幕上有一个Snackbar的情况下再显示一个Snackbar,则先将当前显示的Snackbar隐藏后再显示新的Snackbar;
  • 可以在Snackbar中添加一个按钮,处理用户点击事件;
  • Snackbar一般需要CoordinatorLayout来作为父容器,CoordinatorLayout保证当底部有其他View时,Snackbar显示时可以把其他View顶上去,而不是遮住其他View;

配置可以使用Snackbar控件的仓库

dependencies{
    compile 'com.android.support:design:27.0.0'
}

使用Snackbar的方法

Snackbar.make(View view,CharSequence text,int duration)
    .setAction(Charsequence text,View.OnClickListener listener)
    .show();

make()实现简单弹出

  make() 方法的第一个参数是一个 view,snackbar 会找到一个父 view,以寄存所赋的 snackbar 值。Snackbar 会沿着 view 的树状路径,找到第一个合适的布局或窗口视图,作为父 view。一般是一个CoordinatorLayout对象。
  第二个参数是Snackbar中想要显示的内容,一般只能显示2行;
  第三个参数是Snackbar想要显示的时间长短,有三个值:LENGTH_INDEFINITE 永远显示、LENGTH_LONG显示较长时间、LENGTH_SHORT 显示较短时间;
  Snackbar也要像Toast一样,调用show()方法才能显示。

CoordinatorLayout main_cl = findViewById(R.id.main_cl);
SnackBar.make(main_cl,"标题",SnackBar.LENGTH_LONG).show();

setAction()添加按钮

  Snackbar中还可以有一个按钮,我们称之为Action,它显示在Snackbar的右边,可以通过Snackbar对象的setAction()方法设置。添加setAction()方法,该方法有两个参数,第一个参数是按钮的名称,第二个参数是按钮点击事件的监听方法。

CoordinatorLayout main_cl = findViewById(R.id.main_cl);
SnackBar.make(main_cl,"标题",SnackBar.LENGTH_LONG)
    .setAction("点击事件",new View.OnClickListener(){
        @override
        public void onClick(View v){
            Toast.makeText(MainActivity.this,"show message",Toast.LENGTH_SHORT).show();
        }
    }).show();

监听显示与隐藏

  在Snackbar弹出和消失时,都会触发一个回调事件,我们可以通过Snackbar对象的addCallback()方法(setCallback()方法已经过时)捕获它们。Snackbar.Callback中有两个抽象方法,onDismissed()方法是当Snackbar消失的时候触发的事件;onShown()方法是当Snackbar显示的时候触发的事件。

Snackbar.make(mLinearLayout,"hello world",Snackbar.LENGTH_LONG)
    .setAction("click",new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Toast.makeText(SnackBarActivity.this, "弹出了这个", Toast.LENGTH_SHORT).show();
        }
    })
    .addCallback(new Snackbar.Callback(){
        @Override
        public void onDismissed(Snackbar transientBottomBar, int event) {
            super.onDismissed(transientBottomBar, event);
            Toast.makeText(SnackBarActivity.this, "Snackbar隐藏了", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onShown(Snackbar sb) {
            super.onShown(sb);
            Toast.makeText(SnackBarActivity.this, "Snackbar显示了", Toast.LENGTH_SHORT).show();
        }
    })
    .show();

相关属性设置

  Snackbar支持动态地设置一些属性,如Action的文本颜色、显示的文本内容、显示的持续时间等。

Snackbar snackbar = Snackbar.make(mCoordinatorLayout,"hello world4",Snackbar.LENGTH_LONG);
//动态设置文本;
snackbar.setText("动态设置的文本");
snackbar.setAction("action文本", new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(SnackBarActivity.this, "弹出了这个...", Toast.LENGTH_SHORT).show();
    }
});
//动态设置action文本的颜色;
snackbar.setActionTextColor(Color.parseColor("#FF0000"));
//设置Snackbar显示的时间长度;
snackbar.setDuration(10000);

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.YELLOW);
//设置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.show();