@lovesosoi
2017-10-15T13:51:35.000000Z
字数 3596
阅读 1023
Snackbar 是轻量级的弹出框,可以在屏幕底部显示弹出消息,显示效果更丰富,外部布局为Coordinatorlayout时,可以向右滑动删除消息,同一时间只能显示一个Snackbar。
snackbar 使用与Toast 类似,一般都是用来相应按钮等点击事件,所以我们先定义一个按钮和它的点击事件。
1.常见Snackbar
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_snack_bar);//初始化控件initView();//点击事件tvOnClick.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Snackbar.make(llSnackBar, "常见的SnackBar", 3000).setAction("点击", new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(SnackBarActivity.this,"不能滑动哦",Toast.LENGTH_SHORT).show();}}).show();}});}
常见的Sanckbar的效果图

初始化控件的方法就不放出来了。其中 make() 方法中的第一个参数是: Snackbar 出现在哪个父布局上,第二个参数是:显是在左边的文字,第三个参数是 Snackbar 的显示时间长短,分别是 Snackbar.LENGTH_SHORT , Snackbar.LENGTH_LONG 。setAction() 方法中第一个参数是右边的按钮显示的文字,第二个参数是点击后的的响应事件。 show() 方法是让 Snackbar 生效。
2.改变颜色的Sanckbar
主要思路:通过 Snackbar 的对象获取左右两边的 TextView 和 Button 通过 TextView 的方法去设置文字的相关属性及点击事件,Button 的设置同理。
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_snack_bar);//初始化控件initView();tvStyle.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取 Snackbar 对象final Snackbar sbSlide = Snackbar.make(clSb,"增加图标,颜色改变,文字可点击",3000);View view = sbSlide.getView();//获取左边的TextviewTextView tvSbSuper = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);//获取右边的ButtonButton btnSbSuper = (Button) view.findViewById(android.support.design.R.id.snackbar_action);//设置文字颜色tvSbSuper.setTextColor(getResources().getColor(R.color.colorPrimaryDark));sbSlide.setActionTextColor(getResources().getColor(R.color.green));btnSbSuper.setTextColor(Color.BLACK);//左侧TextView 点击事件tvSbSuper.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(SnackBarActivity.this,"点到了Tv",Toast.LENGTH_SHORT).show();sbSlide.dismiss();}});//左侧 TextView设置 图片、背景颜色Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);tvSbSuper.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);view.setBackgroundColor(Color.YELLOW);sbSlide.setAction("点击", new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(SnackBarActivity.this,"可滑动删除哦",Toast.LENGTH_SHORT).show();}}).show();}});}
改变颜色Snackbar 的效果图

核心代码就是通过 Snackbar 对象找到Textview 和 Button 的对象,找到相应的对象后,进行相应的操作
3.改变布局的Snackbar
主要思路:通过 Snackbar 的对象找到 Snackbar 父布局 SnackbarLayout 的对象,将自己自定义的布局写在 src/res/layout 下,通过布局加载器将自定义的布局加载成View,通过父布局对象的addview() 方法,将布局添加进到 Snackbar 的布局下。
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_snack_bar);//初始化控件initView();tvStyle.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {final Snackbar sb = Snackbar.make(clSb,"更改布局的SnackBar,图片可点击",Snackbar.LENGTH_LONG);View view1 = sb.getView();//Snackbar 的父布局Snackbar.SnackbarLayout sl = (Snackbar.SnackbarLayout) view1;//通过布局加载器加载布局View inflate = LayoutInflater.from(sb.getContext()).inflate(R.layout.item_sb_layout, null);ImageView imageView = (ImageView) inflate.findViewById(R.id.iv_sb);imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(SnackBarActivity.this,"点击了图片",Toast.LENGTH_SHORT).show();sb.dismiss();}});//对新的布局进行设置LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);layoutParams.gravity = Gravity.CENTER;sl.removeAllViews();//将布局加载到父布局sl.addView(inflate, layoutParams);sb.show();}});}
改变布局的 Snackbar 效果图

需要注意的是: Snackbar 可添加view 可删除view,删除原Snackbar view 的子Viwe 后不能调用setAction()等跟原布局控件有关的方法,否则会崩溃。