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

前言

这个工具类参考的是《没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南》,代码几乎一样,所以想要了解具体原理或者更详细信息请阅读参考资料。

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

在项目中到底是使用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 28defaultConfig {applicationId "com.why.project.snackbarutildemo"minSdkVersion 16targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles 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;//红色错误提示:原方案-f44336public static int green = 0xffa1c45a;//绿色成功提示:原方案-4caf50public static int blue = 0xff54B0FF;//蓝色普通提示:原方案-2195f3public 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布局文件(其实没有重要代码)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/btn_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹出Info类型的Snackbar"android:layout_margin="10dp"/><Buttonandroid:id="@+id/btn_confirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹出Confirm类型的Snackbar"android:layout_margin="10dp"/><Buttonandroid:id="@+id/btn_warning"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹出Warning类型的Snackbar"android:layout_margin="10dp"/><Buttonandroid:id="@+id/btn_alert"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹出Alert类型的Snackbar"android:layout_margin="10dp"/></LinearLayout>

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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((Button)findViewById(R.id.btn_info)).setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(View view) {Toast.makeText(MainActivity.this,"重试",Toast.LENGTH_SHORT).show();}}).setActionTextColor(Color.parseColor("#ffffff")).show();}});}
}

混淆配置

参考资料

没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南

SnackbarUtils:一行代码搞定Snackbar

Design库-SnackBar属性详解

项目demo下载地址

https://github.com/haiyuKing/SnackbarUtilDemo

SnackbarUtilDemo【Snackbar的封装类】相关推荐

  1. SnackBar使用详解

    Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用.本文对原生Snackbar进行了修改,使其更加灵活. 前 ...

  2. Android Snackbar花式使用指南

    Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用.本文对原生Snackbar进行了修改,使其更加灵活. 主 ...

  3. MaterialDesign之Snackbar学习笔记

    近期实在太忙了,看到好的文章先转载,后续自己慢慢消化吧! 转载 http://www.jianshu.com/p/cd1e80e64311#rd 没时间解释了,快使用Snackbar!--Androi ...

  4. SnackBar使用注意事项

    添加依赖库要注意版本一致, 下面是不一致出现的错误,,,,,,改为support:design:25.3.1 就没问题了 SnackBar的基本用法 Snackbar.make(view, messa ...

  5. Dialog、Toast、Snackbar,你真的了解它们吗?

    2019独角兽企业重金招聘Python工程师标准>>> 首先来介绍一下Dialog的用法吧,其实很简单,相信大多数人都是经常使用的: AlertDialog.Builder buil ...

  6. C# SQLite数据库 访问封装类

    在客户端配置文件<configuration>节点下,添加: <connectionStrings><add name="localdb" conne ...

  7. Snackbar源码分析

    目录介绍 1.最简单创造方法 1.1 Snackbar作用 1.2 最简单的创建 1.3 Snackbar消失的几种方式 2.源码分析 2.1 Snackbar的make方法源码分析 2.2 对Sna ...

  8. Flutter开发之SnackBar提示组件-4(43)

    SnackBar无论是用法还是功能使用几乎都跟原生Android一样 ,唯一有一点需要留意的是在Scaffold.of(context).showSnackBar()中传递的context必须不能是S ...

  9. freemarker获取封装类中对象的属性(六)

    freemarker获取封装类中对象的属性 假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境 ...

最新文章

  1. UVa 11388 - GCD LCM
  2. 转:求多边形的面积 算法几何
  3. WhqDatabase 我自己用C#开发的列式数据库
  4. html5着陆页模板,多用途着陆页HTML模板
  5. Python爬虫教程:requests模拟登陆github
  6. python更换国内源_一键更换国内云服务器Python pip镜像源至国内Pypi镜像源
  7. rust最低什么显卡能游戏_Steam游戏音轨终于能单独买 游戏显卡铭瑄值得选
  8. jq使用教程08_基于估值波动周期的择时策略
  9. 使用Selenium定位鼠标悬浮出现的下拉菜单
  10. GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器
  11. 解决办法:发生故障,这可能是有软件包被要求保持现状的缘故
  12. RS232和RS485的协议原理及应用
  13. webview的硬件加速
  14. office2003word解除安全模式启动
  15. 《东周列国志》第十九回 擒傅瑕厉公复国 杀子颓惠王反正
  16. 使用H5中的表单标签制作一个简单的网页登陆页面
  17. 【Cocos2D-x 3.5实战】坦克大战(1)环境配置
  18. 想要选好群控系统! 还要先了解的群控发展史
  19. mysql中如何删除某个字段中的某个字符
  20. 清华大学赵志磊--基于thinkPHP6框架的Excel表格导入和导出

热门文章

  1. http://www.shanghaihaocong.com-WORDPRESS开发的企业主题站
  2. CvBlobTrackerCC 多目标跟踪算法简析
  3. php打印warning日志引发的core追查
  4. .net应用程序如何批上XP的外衣?
  5. 适当地使用公共语言运行库的垃圾回收器和自动内存管理
  6. 结构体的两种声明方式:堆上和栈上以及在双链表的应用
  7. 激活函数之softmax介绍及C++实现
  8. php 接口使用场景,接口使用场景、trait基本功能
  9. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
  10. 什么是大数据口子_大数据分析师年薪几十万,学什么专业才能从事大数据?