一.使用ToastUtil
封装的目的:不让业务直接操作具体的框架,而操作我们的API,这样方便后面重构。
在Android开发中,有些时候,可能要求定制Toast,例如:前面显示一个图标,或者正确操作显示绿色,错误操作,显示红色;这时候可以自己定义,可以使用第三方框架。
//toast工具类
//https://github.com/GrenderG/Toasty
implementation 'com.github.GrenderG:Toasty:1.4.2'
项目的根目录build.gradle 文件
buildscript {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }//github网站上说这里也要配置
}
...
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
使用如下:
1.在应用上下文初始化
/**
* 全局Application
*/
public class AppContext extends Application {
/**
* 创建了 (第一次创建应用或者杀掉应用后就会执行一次这个方法)
*/
@Override
public void onCreate() {
super.onCreate();
//初始化toast工具类
Toasty.Config.getInstance().apply();
}
}
2.定义工具类
/**
* Toast工具类
*/
public class ToastUtil {
/**
* 上下文
* 这里的话,是持有应用的引用,所以应该不会造成内存泄漏
*/
@SuppressLint("StaticFieldLeak")//最好写上这句(教程没有的)
private static Context context;
/**
* 初始化方法
*
* @param context Context
*/
public static void init(Context context) {
ToastUtil.context = context;
}
/**
* 显示短时间错误toast
* <p>
* 校验参数
*
* @param id @StringRe:必须是字符串的id
*/
// public static void errorShortToast(@NonNull Context context, @StringRes int id) {
public static void errorShortToast(@StringRes int id) {
//必须要调用show方法
Toasty.error(context, id, Toasty.LENGTH_SHORT).show();
}
/**
* 显示短时间错误toast 字符串的形式 目前requestErrorHandler方法使用到
*
* @param message Message
*/
public static void errorShortToast(String message) {
//必须要调用show方法
Toasty.error(context, message, Toasty.LENGTH_SHORT).show();
}
/**
* 显示长时间错误toast
* @param id 字符串id
*/
// public static void errorLongToast(@NonNull Context context, @StringRes int id) {
public static void errorLongToast(@StringRes int id) {
Toasty.error(context, id, Toasty.LENGTH_LONG).show();
}
/**
* 显示短时间正确toast
*
* @param id 通过id找字符串
*/
// public static void successShortToast(@NonNull Context context, @StringRes int id) {
public static void successShortToast(@StringRes int id) {
Toasty.success(context, id, Toasty.LENGTH_LONG).show();
}
/**
* 显示短时间正确toast
*
* @param data 字符串传入
*/
public static void successShortToast(String data) {
Toasty.success(context, data, Toasty.LENGTH_SHORT).show();
}
}
3.使用工具类
ToastUtil.successShortToast(getMainActivity(), "登录成功");
ToastUtil.errorShortToast(getMainActivity(), R.string.enter_username);
二.重构ToastUtil
可以看到现在,每次使用ToastUtil的时候,还要传递Context,这样写起来比较麻烦,所以可以省略掉。
如何省略?
就是在应用启动的时候,初始化,也就是包context保存到ToastUtil,这样在显示toast的时候,就不用传递了。
1.把Context在应用启动的初始化,并购保存到ToastUtil工具类的static字段中
/**
* 全局Application
*/
public class AppContext extends Application {
/**
* 创建了 (第一次创建应用或者杀掉应用后就会执行一次这个方法)
*/
@Override
public void onCreate() {
super.onCreate();
//初始化toast工具类
Toasty.Config.getInstance().apply();
//初始化Toast工具类
ToastUtil.init(getApplicationContext());
}
}
package com.ixuea.courses.mymusicold.util;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.StringRes;
import es.dmoral.toasty.Toasty;
**重构后的工具类**
/**
* Toast工具类
*/
public class ToastUtil {
/**
* 上下文
* 这里的话,是持有应用的引用,所以应该不会造成内存泄漏
*/
@SuppressLint("StaticFieldLeak")//最好写上这句(教程没有的)
private static Context context;
/**
* 初始化方法
*
* @param context Context
*/
public static void init(Context context) {
ToastUtil.context = context;
}
/**
* 显示短时间错误toast
* <p>
* 校验参数
*
* @param id @StringRe:必须是字符串的id
*/
// public static void errorShortToast(@NonNull Context context, @StringRes int id) {
public static void errorShortToast(@StringRes int id) {
//必须要调用show方法
Toasty.error(context, id, Toasty.LENGTH_SHORT).show();
}
/**
* 显示长时间错误toast
* @param id 字符串id
*/
// public static void errorLongToast(@NonNull Context context, @StringRes int id) {
public static void errorLongToast(@StringRes int id) {
Toasty.error(context, id, Toasty.LENGTH_SHORT).show();
}
// public static void successLongToast(@NonNull Context context, @StringRes int id) {
public static void successLongToast(@StringRes int id) {
Toasty.success(context, id, Toasty.LENGTH_SHORT).show();
}
}