安卓Java开发记录——工具类的封装使用(ToastUtil提示工具类)

1,147 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

前言

今天我们来看看安卓开发中比较常用的封装的工具类,其实之前也说过(安卓开发基础——简化Toast调用方法 - 掘金 (juejin.cn)),但当时是在Kotlin中,我们使用扩展方法写的,有读者评论说有内存泄漏风险,所以今天看看我们开发中封装的Java方法。

正篇

首先,我们要用到封装的控件Toasty(GrenderG/Toasty: The usual Toast, but with steroids 💪 (github.com)),这个控件的导入方法有点不一样,得先在你的Project的 build.gradle 文件( 不是 你的Module的 build.gradle 文件)加入jitPack的maven:

allprojects {
	repositories {
		...
		maven { url "https://jitpack.io" }
	}
}

上面是官方的推荐,我们现在如果直接创建项目得在项目的settings.gradle文件中添加:

...
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        //添加
        maven { url "https://jitpack.io" }
    }
}
...

然后在app/build.gradle文件中的dependencies加入下面的依赖:

dependencies {

    ...
    implementation 'com.github.GrenderG:Toasty:1.5.2'
    '''
}

完成之后,我们Sync Gradle,这样我们就能使用Toasty了,它是Toast类的加强版,然后我们来使用它的custom()方法去自定义自己的Toast。同样,这个我们去再封装一遍是因为,它和原生的Toast有同样的难受之处,不要忘记 show() 方法!,这当然容易忘记,所以我们提前封装好:

image.png image.png

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import es.dmoral.toasty.Toasty;

public class ToastUtil {

    public static void init() {
        Toasty.Config.getInstance().allowQueue(false).apply();
    }

    public static void show(final Context context, final String message) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toasty.custom(context,
                                message,
                                ResUtil.getColorAttr(context, R.attr.color_default_toast),
                                ResUtil.getColorAttr(context, R.attr.color_default_text),
                                Toast.LENGTH_SHORT,
                                true,
                                true)
                        .show();
            }
        });
    }

    public static void showLongImmediately(final Context context, final String message) {
        Toasty.custom(context,
                        message,
                        ResUtil.getColorAttr(context, R.attr.color_default_toast),
                        ResUtil.getColorAttr(context, R.attr.color_default_text),
                        Toast.LENGTH_LONG,
                        true,
                        true)
                .show();
    }


    public static void show(Context context, int textRes) {
        show(context, context.getResources().getString(textRes));
    }
}

上面代码中的 ResUtil.getColorAttr()方法也是我们封装好的,这个是用来获取属性中的颜色资源:

import android.content.Context;
import android.os.Build;
import android.util.TypedValue;


/**
 * 用于获取内置资源
 */
public class ResUtil {

    /**
     * 获取属性中的颜色资源
     *
     * @param context
     * @param attr
     *
     * @return
     */
    public static int getColorAttr(Context context, int attr) {
        TypedValue typedValue = new TypedValue();
        context.getTheme().resolveAttribute(attr, typedValue, true);
        return typedValue.data;
    }

    /**
     * 获取属性中的尺寸资源
     *
     * @param context
     * @param attr
     *
     * @return
     */
    public static int getDimenAttr(Context context, int attr) {
        TypedValue typedValue = new TypedValue();
        context.getTheme().resolveAttribute(attr, typedValue, true);
        float dimen = typedValue.getDimension(DisplayUtil.getDisplayMetrics(context));
        return (int) dimen;
    }

    /**
     * 获取颜色资源
     *
     * @param context
     * @param colorRes
     *
     * @return
     */
    public static int getColor(Context context, int colorRes) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return context.getResources().getColor(colorRes, context.getTheme());
        } else {
            return context.getResources().getColor(colorRes);
        }
    }

    /**
     * 获取string资源
     *
     * @param context
     * @param res
     *
     * @return
     */
    public static String getString(Context context, int res) {
        return context.getResources().getString(res);
    }

    /**
     * 获取string数组资源
     *
     * @param context
     * @param res
     *
     * @return
     */
    public static String[] getStringArray(Context context, int res) {
        return context.getResources().getStringArray(res);
    }

    /**
     * 获取int资源
     *
     * @param context
     * @param res
     *
     * @return
     */
    public static int getInt(Context context, int res) {
        return context.getResources().getInteger(res);
    }

    /**
     * 获取int资源
     *
     * @param context
     * @param res
     *
     * @return
     */
    public static int[] getIntArray(Context context, int res) {
        return context.getResources().getIntArray(res);
    }

    /**
     * 获取bool资源
     *
     * @param context
     * @param res
     *
     * @return
     */
    public static boolean getBool(Context context, int res) {
        return context.getResources().getBoolean(res);
    }
}

上面的代码就是各种资源获取的工具类,其中还调用了单位转换的工具类DisplayUtil:

import android.content.Context;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.WindowManager;

public class DisplayUtil {

    public static DisplayMetrics getDisplayMetrics(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        if (wm == null) {
            return null;
        }
        DisplayMetrics displayMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    public static DisplayMetrics getDisplayMetrics(WindowManager wm) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    public static DisplayMetrics getRealDisplayMetrics(WindowManager wm) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getRealMetrics(displayMetrics);
            return displayMetrics;
        } else {
            return getDisplayMetrics(wm);
        }
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dp(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     *根据手机的分辨率从 sp 的单位 转成为 px(像素)
     */
    public static int sp2px(Context context, float pxValue){
        final float scale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue * scale +0.5f);
    }

    public static int getScreenWidthInPx(Context context) {
        DisplayMetrics dm = context.getApplicationContext().getResources().getDisplayMetrics();
        return dm.widthPixels;
    }

    public static int getScreenHeightInPx(Context context) {
        DisplayMetrics dm = context.getApplicationContext().getResources().getDisplayMetrics();
        return dm.heightPixels;
    }

    /**
     *获取状态栏高度
     */
    public static float getStatusBarHeight(Context context) {
        float height = 0;
        int resourceId = context.getApplicationContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            height = context.getApplicationContext().getResources().getDimensionPixelSize(resourceId);
        }
        return height;
    }

    public static int getScreenHeight(Context context) {
        return (int) (getScreenHeightInPx(context) + getStatusBarHeight(context));
    }

}

上面的代码先附上,下篇文章我们再细说这两个工具类,本篇先说ToastUtil类的封装使用。

ToastUtil中我们封装了四个方法,一个初始化配置方法和三个show的方法,三个show分别是自定义了文字与图标颜色资源的长提示与短提示,以及最后一个更加简化好用的show(调用了自定义长提示)。

这样封装好后,我们一般只需要调用这个类的show()即可,传入我们的Context与文字字符串或者文字资源id即可完成一个提示的显示操作。

ToastUtil.show(getApplicationContext(), "666");

这样一个Toast的强化的封装即完成,调用也很方便了。

总结

把常用的方法封装成工具类,这样调用的时候会更方便,提高我们的开发效率。