【Android - MD】之Snackbar的使用

Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件,用来代替 Toast ,Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也可以处理用户交互(点击)事件。

Snackbar的特点如下:

  • Snackbar会在超时或者用户在屏幕其他地方触摸之后自动消失
  • 可以在屏幕上滑动关闭
  • 出现时不会阻碍用户在屏幕上的输入
  • 不支持输入
  • 屏幕上同时最多只能显示一个Snackbar
  • 如果在屏幕上有一个Snackbar的情况下再显示一个Snackbar,则先将当前显示的Snackbar隐藏后再显示新的Snackbar
  • 可以在Snackbar中添加一个或多个按钮,处理用户点击事件
  • Snackbar一般需要Coordinatorlayout来作为容器盛放,CoordinatorLayout保证Snackbar可以右滑推出

首先,使用MD包中的控件,都需要先在gradle文件中导入依赖:

compile ‘com.android.support:design:25.0.0‘

1、弹出Snackbar:

弹出Snackbar的方式是调用Snackbar类中的静态方法make(),返回一个Snackbar对象:

Snackbar simple_snackbar = Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE);
simple_snackbar.show();

make()方法的第一个参数是Snackbar的容器对象,一般是一个CoordinatorLayout对象;

第二个参数是Snackbar中想要显示的内容,一般只能显示2行;

第三个参数是Snackbar想要显示的时间长短,有三个值:LENGTH_INDEFINITE 永远显示、LENGTH_LONG显示较长时间、LENGTH_SHORT 显示较短时间;

Snackbar也要像Toast一样,调用show()方法才能显示。

2、添加按钮:

除了显示之外,Snackbar中还可以有一个按钮,我们称之为Action,它显示在Snackbar的右边,可以通过Snackbar对象的setAction()方法设置:

    Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
            .setAction("Action1", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Snackbar.make(container, "Action1 Clicked......", Snackbar.LENGTH_SHORT).show();
        }
    }).show();

可以看出来,setAction()方法中的第一个参数是按钮显示的文本;

第二个参数是点击按钮触发的事件。

3、添加显示/隐藏回调:

在Snackbar弹出和消失时,都会触发一个回调事件,我们可以通过Snackbar对象的setCallback()方法捕获它们:

    Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
            .setCallback(new Snackbar.Callback() {
        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            Toast.makeText(MainActivity.this, "Snackbar隐藏", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onShown(Snackbar snackbar) {
            Toast.makeText(MainActivity.this, "Snackbar显示", Toast.LENGTH_SHORT).show();
        }
    });

Snackbar.Callback中有两个抽象方法,onDismissed()方法是当Snackbar消失的时候触发的事件;onShown()方法是当Snackbar显示的时候触发的事件。

4、动态设置属性:

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

    // 使用Snackbar的API中的方法设置Action按钮的文本颜色
    simple_snackbar.setActionTextColor(Color.GREEN);
    // 动态的为Snackbar设置文本
    simple_snackbar.setText("这是新的文本");
    // 设置Snackbar显示的时间为一个具体的值
    simple_snackbar.setDuration(5000);

其他的如显示文本的颜色、背景颜色等需要通过Snackbar对象的getView()方法获取View之后,通过View找到各个控件后才能进行属性的设置:

    // 获取Snackbar中显示的View对象
    View view = snackbar.getView();
    // 找到Snackbar中的显示内容TextView并设置颜色
    ((TextView) view.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(textColor);
    // 找到Snackbar中的Action按钮并设置文本颜色
    ((TextView) view.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(actionColor);
    // 设置整个Snackbar的背景颜色
    view.setBackgroundColor(bgColor);

到此为止,弹出的Snackbar的演示结果如下图所示:

5、向Snackbar中添加自定义View:

Android为我们提供的Snackbar中最多只能显示一个Action,如果多次调用setAction()方法设置Action,结果将是显示最后一次添加的Action。我们要想添加更过的按钮或其他控件,就需要调用这样一个工具类:

/**
 * Snackbar的工具类
 * addViewToSnackbar()方法:当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
 * setAction()方法:为Snackbar中新添加的按钮设置文本和点击事件
 */
public class SnackbarUtil {
    /**
     * 当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
     *
     * @param snackbar Snackbar对象
     * @param layoutId 新的布局ID
     * @param index    当index值为1时,将新布局添加到消息文本后面,action按钮前面
     */
    public static void addViewToSnackbar(Snackbar snackbar, int layoutId, int index) {
        // 获取snackbar的View(实就是SnackbarLayout)
        View snackbarview = snackbar.getView();
        // 将获取的View转换成SnackbarLayout
        Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbarview;
        // 加载布局文件新建View
        View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId, null);
        // 设置新建布局参数
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
<span style="white-space:pre">        </span>LinearLayout.LayoutParams.WRAP_CONTENT);
        // 设置新建布局在Snackbar内垂直居中显示
        p.gravity = Gravity.CENTER_VERTICAL;
        // 将新建布局添加进snackbarLayout相应位置
        snackbarLayout.addView(add_view, index, p);
    }

    /**
     * 为Snackbar中新添加的按钮设置文本和点击事件
     *
     * @param snackbar        Snackbar对象
     * @param btn_id          新添加的按钮的ID
     * @param action_string   新添加的按钮中展示的文本
     * @param onClickListener 新添加的按钮的点击事件
     */
    public static void setAction(Snackbar snackbar, int btn_id, String action_string, View.OnClickListener onClickListener) {
        View view = snackbar.getView();//获取Snackbar的view
        if (view != null) {
            //为添加的按钮设置监听器
            ((Button) view.findViewById(btn_id)).setText(action_string);
            (view.findViewById(btn_id)).setOnClickListener(onClickListener);
        }
    }

    /**
     * 为Snackbar中新添加的ImageView设置展示的图片资源ID
     *
     * @param snackbar Snackbar对象
     * @param iv_id    ImageView的ID
     * @param res_id   要在ImageView中展示的图片的资源ID
     */
    public static void setImageAction(Snackbar snackbar, int iv_id, int res_id) {
        View view = snackbar.getView();//获取Snackbar的view
        if (view != null) {
            //为添加的按钮设置监听器
            ((ImageView) view.findViewById(iv_id)).setImageResource(res_id);
        }
    }
}

然后,在代码中调用这个类中的addViewToSnackbar()和addAction()方法,就可以添加更过的View了:

    // 添加一个自定义按钮
    SnackbarUtil.addViewToSnackbar(custom_snackbar, R.layout.sideworks_extrabtn, 1);
    SnackbarUtil.setAction(custom_snackbar, R.id.extra_btn, "取消", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "取消删除", Toast.LENGTH_SHORT).show();
            custom_snackbar.dismiss();
        }
    });

再多添加几个控件之后,运行结果如下图所示:

6、调整Snackbar显示的位置:

Android为我们提供的Snackbar默认是显示在屏幕的最底部,但是我们也可以自己定义Snackbar的显示位置,方法是设置Snackbar中View的LayoutParams,例如,我们想让Snackbar在父布局的中间显示,就可以这样写:

    // 设置Snackbar在CoordinatorLayout中居中显示
    View snackbarView = center_snackbar.getView();
    ViewGroup.LayoutParams lp = snackbarView.getLayoutParams();
    CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(lp.width, lp.height);
    params.gravity = Gravity.CENTER_VERTICAL;
    snackbarView.setLayoutParams(params);

运行之后的结果如下图所示:

以上就是对Snackbar用法的简单介绍,下面贴出码云上的源码,供大家参考。

DEMO地址

时间: 2024-10-02 03:18:41

【Android - MD】之Snackbar的使用的相关文章

【Android - MD】之FloatingActionButton的使用

FloatingActionButton(FAB) 是 Android 5.0 新特性--Material Design 中的一个控件,是一种悬浮的按钮. FloatingActionButton 是 ImageView 的子类,因此它具备ImageView的全部属性. FloatingActionButton 结合 CoordinatorLayout 使用,即可实现悬浮在任意控件的任意位置. 使用 FloatingActionButton 的难点主要是布局,其在JAVA代码中的用法和普通的 I

【Android - MD】之TextInputLayout的使用

TextInputLayout是Android 5.0新特性--Material Design中的一个布局控件,主要用来嵌套EditText,实现数据输入时的一些效果,如: 当输入框获取焦点时,输入提示语会动画移动到输入框上方: 当输入框失去焦点时,如果输入框中没有文本,则提示语动画移动回到输入框中: 当输入不合规范时,会在输入框下方显示错误提示语: 当输入的是密码时,可以选择是否显示"显示密码"的按钮以及按钮的图案: 可以显示输入框中当前文本的长度和要求的长度,等. 需要特别注意的是

【Android - MD】之TabLayout的使用

TabLayout是Android 5.0新特性--Material Design中的一个控件,是一个标签页的导航条,常结合ViewPager完成页面导航. 和其他MD控件一样,使用TabLayout之前需要在gradle文件中声明依赖: compile 'com.android.support:design:25.0.0' 1.TabLayout的属性: app:tabIndicatorColor:TabLayout下面提示条的颜色 app:tabIndicatorHeight:TabLayo

【Android - MD】之NavigationView的使用

NavigationView是Android 5.0新特性--Material Design中的一个布局控件,可以结合DrawerLayout使用,让侧滑菜单变得更加美观(可以添加头部布局). NavigationView需要嵌套在DrawerLayout内部,其相对于单独使用DrawerLayout的优点在于可以额外添加一个HeaderView头部布局.另外,NavigationView中的其他选项都是用menu的形式来编写的,menu中的分支也可以在NavigationView中形成分栏效果

【转】android MD设计

编者按:这一年就快完了,你还没搞懂Material design吗?是嫌文档太长,还是觉得自己英文不好?都没关系,我们善良热情的@十萬個為什麽  帮同学们通读了一遍官方的设计指南,去糙取精,整理出这篇干货超多的学习笔记,打包票学完基本就掌握90%了,别错过咯! 自从Material design发布以来,可乐橙就在一直收集相关素材与资源,研究别人的作品.这套设计风格非常鲜明,带有浓郁的Google式严谨和理性哲学,深得我心.实际上,光是研究素材和别人作品,就能发现一些明显的规律,做出几分相似的设

【Android - MD】之CardView的使用

CardView是Android 5.0新特性--Material Design中的一个布局控件,可以通过属性设置显示一个圆角的类似卡片的视图. 1.CardView的属性: app:cardCornerRadius:CardView的圆角大小 app:cardElevation:CardView的阴影大小 app:cardMaxElevation:CardView最大阴影大小 app:cardPreventCornerOverlap:CardView中的内容是否和圆角重叠,true为不重叠 注

Android Design Support Library--简约而不简单的SnackBar

引言 在之前我有提到这一篇Android Design Support Library系列文章是关于SnackBar的,但是由于要用到CoordinatorLayout所以先翻译了一篇相关文章,如果还不了解的可以先看一下Android Design Support Library–使用CoordinatorLayout来处理滚动 ,这一篇我们讲SnackBar,SnackBar其实就是Toast的升级版,他们之间最大的不同就是:SnackBar会对我们的操作提供一个轻量级的反馈,并且可以对点击事

如何使用android design support library

Android应用Design Support Library完全使用实例 - OPEN 开发经验库http://www.open-open.com/lib/view/open1433385856119.html Android MD风格相关控件小结 - 简书http://www.jianshu.com/p/5e6f2ae1d2ec 在android studio中引用这个库非常简单,只要在 build.gradle 文件中加上这段代码: compile 'com.android.support

Android.Hook框架Cydia篇

Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具. 官网地址:http://www.cydiasubstrate.com/ 官方教程:http://www.cydiasubstrate.com/id/38be592b-bda7-4dd2-b049-cec44ef7a73b SD