首页 存档 技术 查看内容

Android 系统中,那些能大幅提供工作效率的 APIs 前言 getResources().getIdentifier( ...

2018-3-30 13:00 |来自: 互联网 321 0

摘要: 前言 “条条大路通罗马。”工作中,实现某个需求的方式往往不是唯一的,这些不同实现方式不仅表现在代码质量上,还影响着我们的工作效率。就像,在 Android 系统中,总有那么一些鲜为人知的 API 能够减少我们很多零 ...


前言


“条条大路通罗马。”工作中,实现某个需求的方式往往不是唯一的,这些不同实现方式不仅表现在代码质量上,还影响着我们的工作效率。就像,在 Android 系统中,总有那么一些鲜为人知的 API 能够减少我们很多零碎的工作量。于是,就想凭着一些经验,整理一些常用的,找个地方归纳总结,也供日后翻阅。

getResources().getIdentifier(String name, String defType, String defPackage)


根据资源名称获取资源 id。正常情况下,我们会在代码中直接根据资源ID获取资源,比如:

getResources().getDrawable(R.drawable.ic_launcher);

但有时候,资源并不是固定的,需要根据使用情况从多个同类资源中动态选择,比如根据服务器传递给客户端的接口数据动态设置,怎么办呢?设置一个硬编码的映射关系数组?太繁琐!不妨用上这个方法。

一个完整的资源名为package:type/entry,对应该方法的三个参数:资源名称、资源类型、应用包名。举几个例子:

imageView.setImageResource(getResources().getIdentifier("ic_launcher", "drawable", getPackageName()));

radioGroup.check(getResources().getIdentifier("rb_indicator_" position, "id", getPackageName()));

实际使用过程中,第一个参数 name,也就是资源名称,根据需要动态设置,这就需要多个资源在命名时保持一定的规范格式。另外,需要注意的是,直接通过 id 获取资源比通过名字的方式效率更高,所以,如果没有这般特殊需求的话,不提倡使用这个方法获取资源。

TextUtils.isEmpty(CharSequence str)


使用频率超高的字符串判空方法,返回一个 boolean 值,内部实现的判断条件为:str == null || str.length() == 0。备受开发人员喜爱的一个 if 字符串判断,系统已经帮我们封装过。

Html.fromHtml()


解析 Html 格式的富文本内容,并返回一个带样式的字符串,供 TextView 等控件显示。可以解决一些含超链接、图文混排等格式的富文本内容的显示问题。

DateUtils.formatDateTime()


利用 Android SDK 提供的这个日期工具类可以将 long 类型的毫秒级时间数据格式化成特定显示格式的字符串。通常我们使用 Java SDK 中的**DateFormat格式化日期数据,比如new **DateFormat("yyyy-MM-dd HH:mm").format()DateUtils的作用就是替我们封装了这个过程。格式化结果与当前设备的本地语言环境有关。这里列举几个常用 format 格式(中文环境下):

  • FORMAT_SHOW_DATE:3月3日

  • FORMAT_SHOW_TIME:10:37

  • FORMAT_SHOW_WEEKDAY:星期五

  • FORMAT_SHOW_YEAR:2017年3月3日

  • FORMAT_NUMERIC_DATE:3/3

  • FORMAT_NO_MONTH_DAY:三月


Formatter.formatFileSize(Context context, long sizeBytes)


格式化文件大小,将字节数据格式化为 B、KB、M 等单位的相应数据。context 参数用于判断返回结果的字符串顺序,right-to-left 还是 left-to-right 形式的。这个工具类免去我们自己转化计算的过程,非常方便,特别适用于应用内文件下载的类似场景。

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)


将指定单位的尺寸数据按照当前设备屏幕信息转化为相应的像素值。其中,TypedValue 为第一个参数提供了常用的单位值,比如:

  • COMPLEX_UNIT_PX

  • COMPLEX_UNIT_DIP

  • COMPLEX_UNIT_PT

  • COMPLEX_UNIT_SP

源码如下:

public static float applyDimension(int unit, float value, DisplayMetrics metrics){
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}

其实在实际使用过程中,像素值都是 int 整数类型,而该方法返回的是 float 类型,如果直接强制转换的话,会自动舍去小数部分。所以,如果不用该方法的话,通常我们会这么转换:

public static int convertDipToPx(Context context, int dip) {
float scale = context.getResources().getDisplayMetrics().density;
// 0.5f 用于向上取整
return (int) (dip * scale 0.5f * (dip
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部