开启掘金成长之旅!这是我参与「掘金日新计划 · 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() 方法!,这当然容易忘记,所以我们提前封装好:
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的强化的封装即完成,调用也很方便了。
总结
把常用的方法封装成工具类,这样调用的时候会更方便,提高我们的开发效率。