[关闭]
@lovesosoi 2017-10-15T13:51:35.000000Z 字数 3596 阅读 827

11.2.1 Snackbar 的使用


一、Snackbar 基本介绍

Snackbar 是轻量级的弹出框,可以在屏幕底部显示弹出消息,显示效果更丰富,外部布局为Coordinatorlayout时,可以向右滑动删除消息,同一时间只能显示一个Snackbar。

二、使用代码

snackbar 使用与Toast 类似,一般都是用来相应按钮等点击事件,所以我们先定义一个按钮和它的点击事件。
1.常见Snackbar

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_snack_bar);
  4. //初始化控件
  5. initView();
  6. //点击事件
  7. tvOnClick.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. Snackbar.make(llSnackBar, "常见的SnackBar", 3000)
  11. .setAction("点击", new View.OnClickListener() {
  12. @Override
  13. public void onClick(View v) {
  14. Toast.makeText(
  15. SnackBarActivity.this,
  16. "不能滑动哦",
  17. Toast.LENGTH_SHORT).show();
  18. }
  19. })
  20. .show();
  21. }
  22. });
  23. }

常见的Sanckbar的效果图

初始化控件的方法就不放出来了。其中 make() 方法中的第一个参数是: Snackbar 出现在哪个父布局上,第二个参数是:显是在左边的文字,第三个参数是 Snackbar 的显示时间长短,分别是 Snackbar.LENGTH_SHORT , Snackbar.LENGTH_LONGsetAction() 方法中第一个参数是右边的按钮显示的文字,第二个参数是点击后的的响应事件。 show() 方法是让 Snackbar 生效。

2.改变颜色的Sanckbar

主要思路:通过 Snackbar 的对象获取左右两边的 TextView 和 Button 通过 TextView 的方法去设置文字的相关属性及点击事件,Button 的设置同理。

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_snack_bar);
  4. //初始化控件
  5. initView();
  6. tvStyle.setOnClickListener(new View.OnClickListener() {
  7. @Override
  8. public void onClick(View v) {
  9. //获取 Snackbar 对象
  10. final Snackbar sbSlide = Snackbar.make(
  11. clSb,
  12. "增加图标,颜色改变,文字可点击",
  13. 3000);
  14. View view = sbSlide.getView();
  15. //获取左边的Textview
  16. TextView tvSbSuper = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
  17. //获取右边的Button
  18. Button btnSbSuper = (Button) view.findViewById(android.support.design.R.id.snackbar_action);
  19. //设置文字颜色
  20. tvSbSuper.setTextColor(getResources().getColor(R.color.colorPrimaryDark));
  21. sbSlide.setActionTextColor(getResources().getColor(R.color.green));
  22. btnSbSuper.setTextColor(Color.BLACK);
  23. //左侧TextView 点击事件
  24. tvSbSuper.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. Toast.makeText(
  28. SnackBarActivity.this,
  29. "点到了Tv",
  30. Toast.LENGTH_SHORT)
  31. .show();
  32. sbSlide.dismiss();
  33. }
  34. });
  35. //左侧 TextView设置 图片、背景颜色
  36. Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
  37. tvSbSuper.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
  38. view.setBackgroundColor(Color.YELLOW);
  39. sbSlide.setAction("点击", new View.OnClickListener() {
  40. @Override
  41. public void onClick(View v) {
  42. Toast.makeText(
  43. SnackBarActivity.this,
  44. "可滑动删除哦",
  45. Toast.LENGTH_SHORT)
  46. .show();
  47. }
  48. }).show();
  49. }
  50. });
  51. }

改变颜色Snackbar 的效果图

核心代码就是通过 Snackbar 对象找到Textview 和 Button 的对象,找到相应的对象后,进行相应的操作

3.改变布局的Snackbar

主要思路:通过 Snackbar 的对象找到 Snackbar 父布局 SnackbarLayout 的对象,将自己自定义的布局写在 src/res/layout 下,通过布局加载器将自定义的布局加载成View,通过父布局对象的addview() 方法,将布局添加进到 Snackbar 的布局下。

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_snack_bar);
  4. //初始化控件
  5. initView();
  6. tvStyle.setOnClickListener(new View.OnClickListener() {
  7. @Override
  8. public void onClick(View v) {
  9. final Snackbar sb = Snackbar.make(
  10. clSb,
  11. "更改布局的SnackBar,图片可点击",
  12. Snackbar.LENGTH_LONG);
  13. View view1 = sb.getView();
  14. //Snackbar 的父布局
  15. Snackbar.SnackbarLayout sl = (Snackbar.SnackbarLayout) view1;
  16. //通过布局加载器加载布局
  17. View inflate = LayoutInflater.from(sb.getContext()).inflate(R.layout.item_sb_layout, null);
  18. ImageView imageView = (ImageView) inflate.findViewById(R.id.iv_sb);
  19. imageView.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. Toast.makeText(
  23. SnackBarActivity.this,
  24. "点击了图片",
  25. Toast.LENGTH_SHORT).show();
  26. sb.dismiss();
  27. }
  28. });
  29. //对新的布局进行设置
  30. LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
  31. ViewGroup.LayoutParams.MATCH_PARENT,
  32. ViewGroup.LayoutParams.WRAP_CONTENT);
  33. layoutParams.gravity = Gravity.CENTER;
  34. sl.removeAllViews();
  35. //将布局加载到父布局
  36. sl.addView(inflate, layoutParams);
  37. sb.show();
  38. }
  39. });
  40. }

改变布局的 Snackbar 效果图

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注