版权声明:本文为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 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布局文件(其实没有重要代码)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns: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"> <Button
android:id="@+id/btn_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出Info类型的Snackbar"
android:layout_margin="10dp"/> <Button
android:id="@+id/btn_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出Confirm类型的Snackbar"
android:layout_margin="10dp"/> <Button
android:id="@+id/btn_warning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弹出Warning类型的Snackbar"
android:layout_margin="10dp"/> <Button
android: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 { @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();
}
});
}
}

混淆配置

参考资料

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

SnackbarUtils:一行代码搞定Snackbar

Design库-SnackBar属性详解

项目demo下载地址

https://github.com/haiyuKing/SnackbarUtilDemo

SnackbarUtilDemo【Snackbar的封装类】的更多相关文章

  1. Android快速开发常用知识点系列目录

    项目构建 Android项目目录结构模板以及简单说明[简单版] Android Studio配置统一管理依赖版本号引用 Android多Module下的Application引用方式 APP开篇 An ...

  2. 安卓Design包之超强控件CoordinatorLayout与SnackBar的简单使用

    在前面的Design中,学习使用了TabLayout,NavigationView与DrawerLayout实现的神奇效果,今天就带来本次Design包中我认为最有意义的控件CoordinatorLa ...

  3. c#生成静态html文件,封装类

    由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...

  4. Android开发学习之路-SnackBar使用心得

    SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackB ...

  5. Android开发2:事件处理及实现简单的对话框(Toast,AlertDialog,Snackbar,TextInputLayout的使用)

    前言 啦啦啦~又要和大家一起学习Android开发啦,博主心里好激动哒~ 在上篇博文中,我们通过线性布局和基础组件的使用,完成了一个简单的学生课外体育积分电子认证系统的界面,本篇博文,将和大家一起熟悉 ...

  6. 自动创建WIN32下多级子目录的C++封装类

            这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单.         封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...

  7. StackExchange.Redis 访问封装类

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...

  8. StackExchange.Redis通用封装类分享(转)

    阅读目录 ConnectionMultiplexer 封装 RedisHelper 通用操作类封 String类型的封装 List类型的封装 Hash类型的封装 SortedSet 类型的封装 key ...

  9. 【MongoDB】 基于C#官方驱动2.2版的封装类

    一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...

随机推荐

  1. Java中的基本类型和引用类型变量的区别

    Java中的基本类型和引用类型变量的区别   学了一年多,说实话你要我说这些东西我是真说不出来是啥意思     基本类型: 基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值. 引用类型: ...

  2. Guava新增集合类型-Multimap

    Guava新增集合类型-Multimap 在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比 ...

  3. .net core使用Apollo做统一配置管理

    做开发这么多年,经常因配置的问题引发生产环境的bug.有些年久的项目,几百个密密麻麻的配置项,经常容易搞混,有时好几个项目有好多同样的配置项,配置工作也不厌其烦.所幸,携程开源了新一代配置中心 - A ...

  4. HTML——元素

    HTML 元素 HTML 文档由 HTML 元素定义. HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href=" ...

  5. python-----HTMLTestRunner报告生成注意点!

    简单的测试加HTMLTestRunner使用的具体方式如下:

  6. Python并发编程之初识异步IO框架:asyncio 上篇(九)

    大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...

  7. C#-Xamarin的Android项目开发(二)——控件应用

    相信我,这不是一篇吐槽文章.... 基础控件 Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计.... 但在这种特别的关系里还是有一定的规律的,下面我们 ...

  8. PHP全栈学习笔记13

    php与ajax技术 web2.0的到来,ajax逐渐成为主流,什么是ajax,ajax的开发模式,优点,使用技术.(ajax概述,ajax使用的技术,需要注意的 问题,在PHP应用ajax技术的应用 ...

  9. 什么是TensorFlow?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零开始学TensorFlow[01-搭 ...

  10. 第2章 授权端点(Authorize Endpoint) - IdentityModel 中文文档(v1.0.0)

    对于大多数情况,OAuth 2.0和OpenID Connect授权端点的GET请求需要具有许多查询字符串参数. 虽然您可以使用任何方法创建带参数的URL来创建正确的字符串,但RequestUrl类是 ...