博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SnackbarUtilDemo【Snackbar的封装类】
阅读量:6501 次
发布时间:2019-06-24

本文共 10008 字,大约阅读时间需要 33 分钟。

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

这个工具类参考的是《》,代码几乎一样,所以想要了解具体原理或者更详细信息请阅读参考资料。

这里只是做了一个简单的记录。

在项目中到底是使用Toast还是Snackbar,可以从这一方面考虑,Toast会显示在输入法键盘上方,Snackbar不会显示在输入法键盘上方(会被输入法键盘遮挡住);

效果图

代码分析

SnackbarUtil.java:Snackbar封装类

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

1、在build.gradle中引入design支持库【版本号跟appcompat保持一致】

apply plugin: 'com.android.application'android {    compileSdkVersion 28    defaultConfig {        applicationId "com.why.project.snackbarutildemo"        minSdkVersion 16        targetSdkVersion 28        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    implementation fileTree(dir: 'libs', include: ['*.jar'])    implementation 'com.android.support:appcompat-v7:28.0.0'    implementation 'com.android.support.constraint:constraint-layout:1.1.3'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'com.android.support.test:runner:1.0.2'    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'    //引入design库    implementation 'com.android.support:design:28.0.0'}

2、将SnackbarUtil复制到项目中

package com.why.project.snackbarutildemo.utils;import android.graphics.Color;import android.support.design.widget.Snackbar;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.widget.LinearLayout;import android.widget.TextView;import com.why.project.snackbarutildemo.R;/** * Used Snackbar封装类 * https://www.jianshu.com/p/cd1e80e64311 */public class SnackbarUtil {    public static final int Info = 1;//普通提示    public static final int Confirm = 2;//成功提示    public static final int Warning = 3;//警告提示    public static final int Alert = 4;//错误提示    public static int red = 0xffFE4949;//红色错误提示:原方案-f44336    public static int green = 0xffa1c45a;//绿色成功提示:原方案-4caf50    public static int blue = 0xff54B0FF;//蓝色普通提示:原方案-2195f3    public static int orange = 0xffFF8438;//橙色警告提示:原方案-ffc107    /**     * 短显示Snackbar,自定义颜色     * @param view     * @param message     * @param messageColor     * @param backgroundColor     * @return     */    public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);// 短时间显示,然后自动取消        setSnackbarColor(snackbar,messageColor,backgroundColor);        return snackbar;    }    /**     * 长显示Snackbar,自定义颜色     * @param view     * @param message     * @param messageColor     * @param backgroundColor     * @return     */    public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);// 长时间显示,然后自动取消        setSnackbarColor(snackbar,messageColor,backgroundColor);        return snackbar;    }    /**     * 自定义时常显示Snackbar,自定义颜色     * @param view     * @param message     * @param messageColor     * @param backgroundColor     * @return     */    public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int messageColor, int backgroundColor){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);// 不消失显示,除非手动取消        setSnackbarColor(snackbar,messageColor,backgroundColor);        return snackbar;    }    /**     * 短显示Snackbar,可选预设类型     * @param view     * @param message     * @param type     * @return     */    public static Snackbar ShortSnackbar(View view, String message, int type){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);// 短时间显示,然后自动取消        switchType(snackbar,type);        return snackbar;    }    /**     * 长显示Snackbar,可选预设类型     * @param view     * @param message     * @param type     * @return     */    public static Snackbar LongSnackbar(View view, String message,int type){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);// 长时间显示,然后自动取消        switchType(snackbar,type);        return snackbar;    }    /**     * 自定义时常显示Snackbar,可选预设类型     * @param view     * @param message     * @param type     * @return     */    public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int type){        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);// 不消失显示,除非手动取消        switchType(snackbar,type);        return snackbar;    }    //选择预设类型    private static void switchType(Snackbar snackbar,int type){        switch (type){            case Info:                setSnackbarColor(snackbar,blue);                break;            case Confirm:                setSnackbarColor(snackbar,green);                break;            case Warning:                setSnackbarColor(snackbar,orange);                break;            case Alert:                setSnackbarColor(snackbar,Color.YELLOW,red);                break;        }    }    /**     * 设置Snackbar背景颜色     * @param snackbar     * @param backgroundColor     */    public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) {        View view = snackbar.getView();        if(view!=null){            view.setBackgroundColor(backgroundColor);        }    }    /**     * 设置Snackbar文字和背景颜色     * @param snackbar     * @param messageColor     * @param backgroundColor     */    public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {        View view = snackbar.getView();        if(view!=null){            view.setBackgroundColor(backgroundColor);            ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);        }    }    /**     * 向Snackbar中添加view【用于添加图标】【Google不建议】     * @param snackbar     * @param layoutId     * @param index 新加布局在Snackbar中的位置     */    public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) {        View snackbarview = snackbar.getView();        Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;        View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);        p.gravity= Gravity.CENTER_VERTICAL;        snackbarLayout.addView(add_view,index,p);    }}
SnackbarUtil.java

三、使用方法

activity_main.xml布局文件(其实没有重要代码)

activity_main.xml

在Activity中使用SnackbarUtil.java类

package com.why.project.snackbarutildemo;import android.graphics.Color;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.why.project.snackbarutildemo.utils.SnackbarUtil;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ((Button)findViewById(R.id.btn_info)).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                /*这个view是有讲究的——我们传入的view经过了findSuitableParent()方法的包装。                1.当传入的View不为空时,如果我们在布局中发现了CoordinatorLayout布局,那么View就是CoordinatorLayout;                2.如果没有CoordinatorLayout布局,我们就先找到一个id为android.R.id.content的FrameLayout(这个布局是最底层的根布局),将View设置为该FrameLayout;                3.其他情况下就使用View的Parent布局,一直到这个View不为空。*/                SnackbarUtil.ShortSnackbar(view,"已超出范围,请重新选择",SnackbarUtil.Info).show();            }        });        ((Button)findViewById(R.id.btn_confirm)).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                /*这个view是有讲究的——我们传入的view经过了findSuitableParent()方法的包装。                1.当传入的View不为空时,如果我们在布局中发现了CoordinatorLayout布局,那么View就是CoordinatorLayout;                2.如果没有CoordinatorLayout布局,我们就先找到一个id为android.R.id.content的FrameLayout(这个布局是最底层的根布局),将View设置为该FrameLayout;                3.其他情况下就使用View的Parent布局,一直到这个View不为空。*/                SnackbarUtil.ShortSnackbar(view,"保存成功",SnackbarUtil.Confirm).show();            }        });        ((Button)findViewById(R.id.btn_warning)).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                /*这个view是有讲究的——我们传入的view经过了findSuitableParent()方法的包装。                1.当传入的View不为空时,如果我们在布局中发现了CoordinatorLayout布局,那么View就是CoordinatorLayout;                2.如果没有CoordinatorLayout布局,我们就先找到一个id为android.R.id.content的FrameLayout(这个布局是最底层的根布局),将View设置为该FrameLayout;                3.其他情况下就使用View的Parent布局,一直到这个View不为空。*/                SnackbarUtil.ShortSnackbar(view,"标题不能为空",SnackbarUtil.Warning).show();            }        });        ((Button)findViewById(R.id.btn_alert)).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                /*这个view是有讲究的——我们传入的view经过了findSuitableParent()方法的包装。                1.当传入的View不为空时,如果我们在布局中发现了CoordinatorLayout布局,那么View就是CoordinatorLayout;                2.如果没有CoordinatorLayout布局,我们就先找到一个id为android.R.id.content的FrameLayout(这个布局是最底层的根布局),将View设置为该FrameLayout;                3.其他情况下就使用View的Parent布局,一直到这个View不为空。*/                SnackbarUtil.ShortSnackbar(view,"保存失败",SnackbarUtil.Alert).setAction("重试", new View.OnClickListener() {                    @Override                    public void onClick(View view) {                        Toast.makeText(MainActivity.this,"重试",Toast.LENGTH_SHORT).show();                    }                }).setActionTextColor(Color.parseColor("#ffffff")).show();            }        });    }}

混淆配置

参考资料

项目demo下载地址

你可能感兴趣的文章
VMware虚拟机出现“需要整合虚拟机磁盘”的解决方法
查看>>
ibatis 动态查询
查看>>
汇编语言之实验一
查看>>
git 调用 Beyond Compare
查看>>
SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
查看>>
android实现图片识别的几种方法
查看>>
mvc学习地址
查看>>
masonry 基本用法
查看>>
使用openssl创建自签名证书及部署到IIS教程
查看>>
Word产品需求文档,已经过时了【转】
查看>>
dtoj#4299. 图(graph)
查看>>
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
Visual Studio Remote Debugger(for 2005/2008) .net远程调试<转>
查看>>