zoukankan      html  css  js  c++  java
  • 【Android

    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地址

  • 相关阅读:
    # ConfigureAwait常见问题解答
    # Oracle 常用语句
    # C# 中的Task创建指南
    ASP.NET Core Web API 跨域(CORS) Cookie问题
    Order by 优化
    VMware 安装 CentOS 7
    ThreadLocal 内存泄漏问题深入分析
    Zookeeper 如何保证分布式系统数据一致性
    Redis 5.0 安装
    Redisson 实现分布式锁的原理分析
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6210752.html
Copyright © 2011-2022 走看看