敞开生长之旅!这是我参与「日新方案 2 月更文挑战」的第 24 天,点击检查活动概况
前语
今日咱们来看看安卓开发中比较常用的封装的东西类,其实之前也说过(安卓开发基础——简化Toast调用办法 – ()),但当时是在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的强化的封装即完结,调用也很方便了。
总结
把常用的办法封装成东西类,这样调用的时候会更方便,进步咱们的开发功率。