敞开生长之旅!这是我参与「日新方案 2 月更文挑战」的第 24 天,点击检查活动概况

前语

今日咱们来看看安卓开发中比较常用的封装的东西类,其实之前也说过(安卓开发基础——简化Toast调用办法 – ()),但当时是在Kotlin中,咱们运用扩展办法写的,有读者评论说有内存走漏风险,所以今日看看咱们开发中封装的Java办法。

正篇

首先,咱们要用到封装的控件Toasty(GrenderG/Toasty: The usual Toast, but with steroids (github.com)),这个控件的导入办法有点不一样,得先在你的Projectbuild.gradle文件(不是你的Modulebuild.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()办法!,这当然容易忘记,所以咱们提前封装好:

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

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的强化的封装即完结,调用也很方便了。

总结

把常用的办法封装成东西类,这样调用的时候会更方便,进步咱们的开发功率。