一、获取资源文件中的配置
1. 获取颜色值
res/values/colors.xml 中定义:
<color name="colorprimary">#3f51b5</color> <color name="coloraccent">#ff4081</color>
获取方法:
java 中获取:
// 获取颜色值(int类型,包含alpha通道) int color = getresources().getcolor(r.color.colorprimary, gettheme()); // 兼容旧版本 int color = contextcompat.getcolor(context, r.color.colorprimary);
kotlin 中获取:
// 直接扩展函数方式 val color = contextcompat.getcolor(context, r.color.colorprimary) // 或使用资源扩展 val color = context.getcolor(r.color.colorprimary)
2. 获取字符串
res/values/strings.xml 中定义:
<string name="app_name">myapplication</string> <string name="welcome_message">hello, %s!</string>
获取方法:
java 中获取:
// 获取普通字符串 string appname = getresources().getstring(r.string.app_name); // 获取带参数的字符串 string welcomemsg = getresources().getstring(r.string.welcome_message, "john");
kotlin 中获取:
// 获取普通字符串 val appname = resources.getstring(r.string.app_name) // 获取带参数的字符串 val welcomemsg = getstring(r.string.welcome_message, "john")
3. 获取尺寸值
res/values/dimens.xml 中定义:
<dimen name="padding_medium">16dp</dimen>
获取方法:
java 中获取:
// 获取像素值(会自动将dp/sp转换为px) float padding = getresources().getdimension(r.dimen.padding_medium); // 获取精确像素值(不进行四舍五入) float paddingexact = getresources().getdimensionpixelsize(r.dimen.padding_medium);
kotlin 中获取:
val padding = resources.getdimension(r.dimen.padding_medium) val paddingexact = resources.getdimensionpixelsize(r.dimen.padding_medium)
4. 获取整型/布尔值
res/values/integers.xml 中定义:
<integer name="max_count">10</integer> <bool name="is_debug">true</bool>
获取方法:
java 中获取:
int maxcount = getresources().getinteger(r.integer.max_count); boolean isdebug = getresources().getboolean(r.bool.is_debug);
kotlin 中获取:
val maxcount = resources.getinteger(r.integer.max_count) val isdebug = resources.getboolean(r.bool.is_debug)
5. 获取数组
res/values/arrays.xml 中定义:
<string-array name="planets_array"> <item>mercury</item> <item>venus</item> <item>earth</item> </string-array> <integer-array name="numbers_array"> <item>1</item> <item>2</item> <item>3</item> </integer-array>
获取方法:
java 中获取:
string[] planets = getresources().getstringarray(r.array.planets_array); int[] numbers = getresources().getintarray(r.array.numbers_array);
kotlin 中获取:
val planets = resources.getstringarray(r.array.planets_array) val numbers = resources.getintarray(r.array.numbers_array)
二、获取应用包信息
1. 获取当前应用信息
java/kotlin 通用方法:
// 获取包信息 packagemanager pm = context.getpackagemanager(); string packagename = context.getpackagename(); try { packageinfo packageinfo = pm.getpackageinfo(packagename, 0); // 应用版本信息 string versionname = packageinfo.versionname; int versioncode = packageinfo.versioncode; // 注意: 新api中使用long类型的versioncode // 应用名称 string appname = pm.getapplicationlabel(packageinfo.applicationinfo).tostring(); // 应用图标 drawable appicon = pm.getapplicationicon(packagename); } catch (packagemanager.namenotfoundexception e) { e.printstacktrace(); }
kotlin 简化版:
val pm = context.packagemanager val packagename = context.packagename try { val packageinfo = pm.getpackageinfo(packagename, 0) val versionname = packageinfo.versionname val versioncode = packageinfo.longversioncode // 注意使用longversioncode val appname = pm.getapplicationlabel(packageinfo.applicationinfo).tostring() val appicon = pm.getapplicationicon(packagename) } catch (e: packagemanager.namenotfoundexception) { e.printstacktrace() }
2. 获取其他应用信息
// 检查应用是否安装 boolean isappinstalled = ispackageinstalled("com.example.app", context); public static boolean ispackageinstalled(string packagename, context context) { try { context.getpackagemanager().getpackageinfo(packagename, 0); return true; } catch (packagemanager.namenotfoundexception e) { return false; } } // 获取已安装应用列表 list<applicationinfo> apps = context.getpackagemanager().getinstalledapplications(0); for (applicationinfo appinfo : apps) { string appname = appinfo.loadlabel(context.getpackagemanager()).tostring(); string packagename = appinfo.packagename; drawable icon = appinfo.loadicon(context.getpackagemanager()); // 处理应用信息... }
三、获取第三方依赖包信息
1. 使用 buildconfig 获取依赖版本
gradle 会自动为每个依赖库生成 buildconfig 类,可以获取版本信息:
// 获取gson库版本 string gsonversion = com.google.gson.buildconfig.version_name; // 获取glide库版本 string glideversion = com.bumptech.glide.buildconfig.version_name;
2. 通过 packagemanager 获取依赖信息
// 获取所有已安装包信息 list<packageinfo> packages = getpackagemanager().getinstalledpackages(0); for (packageinfo packageinfo : packages) { if (packageinfo.packagename.startswith("com.google.") || packageinfo.packagename.startswith("com.facebook.")) { // 这是google或facebook的库 string packagename = packageinfo.packagename; string versionname = packageinfo.versionname; int versioncode = packageinfo.versioncode; } }
3. 使用反射获取内部信息(不推荐,仅作了解)
try { class<?> clazz = class.forname("com.some.library.internal.version"); field versionfield = clazz.getfield("version"); string version = (string) versionfield.get(null); } catch (exception e) { e.printstacktrace(); }
四、动态获取资源id
有时我们需要根据资源名称动态获取资源id:
// 获取资源id public static int getresourceid(context context, string resourcename, string type) { return context.getresources().getidentifier(resourcename, type, context.getpackagename()); } // 使用示例 int colorid = getresourceid(context, "colorprimary", "color"); int stringid = getresourceid(context, "app_name", "string"); int drawableid = getresourceid(context, "ic_launcher", "drawable");
五、主题属性获取
从当前主题获取属性值:
// 创建一个typedarray typedarray typedarray = context.gettheme().obtainstyledattributes(new int[]{r.attr.colorprimary}); try { // 获取颜色值 int colorprimary = typedarray.getcolor(0, color.black); } finally { typedarray.recycle(); }
六、多语言资源获取
获取特定语言环境的资源:
// 创建特定locale的configuration configuration config = new configuration(resources.getconfiguration()); config.setlocale(new locale("es")); // 西班牙语 // 创建新的context context localizedcontext = context.createconfigurationcontext(config); // 使用新context获取资源 string localizedstring = localizedcontext.getresources().getstring(r.string.welcome_message);
最佳实践建议
资源获取优化:
- 避免在循环中频繁获取资源
- 在activity/fragment生命周期早期获取常用资源并缓存
空值处理:
- 总是检查资源是否存在
- 为getstring()等方法提供默认值
性能考虑:
- 使用contextcompat等兼容类确保向后兼容
- 注意typedarray使用后必须recycle()
安全性:
- 处理获取其他应用信息时的权限问题
- 不要暴露敏感信息在buildconfig中
资源命名规范:
- 使用一致的命名约定(如colorprimary, text_heading等)
- 避免硬编码资源id
通过以上方法,可以灵活地从android应用的配置文件中获取各种资源,并获取应用及第三方库的包信息,为应用开发提供更多可能性。
以上就是android studio获取配置资源与第三方包信息的方法的详细内容,更多关于android studio配置资源与第三方包信息的资料请关注代码网其它相关文章!
发表评论