作者:京江晚报经济民生部 | 来源:互联网 | 2022-03-17 14:11
这篇文章主要为大家详细介绍了android换肤功能中如何动态获取控件中背景图片的资源id?,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这个是在在做一个换肤功能时遇到的问题。
对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛)。这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体id,代码:
//先获取本地资源引用名称,type name是R.drawable.background中的"drawable",entry name是"background"
String resTypeName = getContext().getResources().getResourceTypeName(id);
String resEntryName = getContext().getResources().getResourceEntryName(id);
//然后创建皮肤包所在应用的Context
Context apk = getContext().createPackageContext(packageName,
Context.CONTEXT_IGNORE_SECURITY)
//然后就是获取皮肤包中的资源id了
int drawavleId = apk.getResources().getIdentifier(resEntryName, resTypeName,
apk.getPackageName());
这个换肤方案中,每个Activity在切换皮肤时,需要遍历整个layout,判断控件如果id中包含“skin”的字符,意味这个控件是需要换肤的控件,这个控件的id可以先保存下来。
遍历视图的代码
private List skinViewList = new ArrayList (); private void scanViewGroup(ViewGroup group, List skinViewList, Resources res) {
//first we need check if this ViewGroup have a background
if(group.getId() != View.NO_ID
&& res.getResourceEntryName(group.getId()).contains(SKIN_PATTERN)
&& !skinViewList.contains(group)) {
skinViewList.add(group.getId());
}
//second check its child view
View child;
for(int i = 0; i
问题来了,本地应用中,你持有一个控件,比如Button,它的id可以直接调用button.getId()方法获取,但是它的背景图片background呢,我们可以调用button.getBackground()方法获取其对象,但是却没有方法可以获取这个资源图片的引用名称,也就无法得到它的具体id了。后面想到的方案就是,在每次Activity初始化的时候,我们事先遍历每一个控件的属性集AttributeSet,有需要换肤的控件,将其android:background这个属性的值保存下来,为此,需要重载Activity的onCreateView(String name, Context context, AttributeSet attrs)方法,这个方法我的理解是在Activity中每个控件(包括LinearLayout、TextView、Button等等)初始化前会调用,我也打了log,进行了验证,其中attrs参数就是该控件的属性集,这就是我们需要的,代码:
//先判断前面扫描的skinViewList是否为空,不为空意味着有控件需要换肤
if(skinViewList != null && skinViewList.size() > 0) {
int viewId = -1, backgroundId = -1;
for(int i = 0; i
var cpro_id = "u6885494";
推荐阅读
获取年月日,之前的日期不能选择日历cCalendar.getInstance();获取系统的工具类【可以获取时间】DatePickerDialogdate ...
[详细]
蜡笔小新 2024-11-29 17:38:31
本文介绍如何在已拥有签名密钥的情况下为 Ionic 3 开发的 Android 应用程序添加签名。如果您尚未创建签名文件,建议先参考相关指南完成该步骤。 ...
[详细]
蜡笔小新 2024-11-29 17:25:03
本文详细探讨了如何在 Android 应用中使用 ActivityGroup 来实现类似微博客户端主界面的效果,并分析了 TabActivity 的局限性,推荐使用更为灵活的 ActivityGroup 方案。 ...
[详细]
蜡笔小新 2024-11-29 14:14:32
1.选择一个翻译页面,我选择的是有道词典(http:dict.youdao.com)2.随便输入一个英语单词进行翻译,然后查看源文件,找到 ...
[详细]
蜡笔小新 2024-11-29 12:52:41
Sass 是一种 CSS 的预处理器,通过使用变量、嵌套、继承等高级功能,使得 CSS 的编写更加灵活和高效。本文将介绍 Sass 的基本语法及其安装使用方法。 ...
[详细]
蜡笔小新 2024-11-29 09:55:54
TunnelWarfareTimeLimit:1000MS MemoryLimit:131072KTotalSubmissions:7307 ...
[详细]
蜡笔小新 2024-11-29 09:33:01
本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ...
[详细]
蜡笔小新 2024-11-29 09:09:04
本文介绍了EasyRTSPClient这一高效、稳定的RTSP客户端工具库,并详细阐述了其在与大华球机对接过程中遇到的预览问题及解决方法。 ...
[详细]
蜡笔小新 2024-11-29 08:38:47
本文详细探讨了在Linux系统中遇到的高Buff/Cache占用问题及其解决方案,提供了手动清除与定时任务自动化处理的方法。 ...
[详细]
蜡笔小新 2024-11-29 07:52:21
问题描述:给定一个长度为n的数组,其中所有元素值位于0至n-1之间。数组中存在一些重复的数字,但具体哪些数字重复以及重复了多少次未知。本文章将探讨如何高效地找到数组中的任一重复数字。 ...
[详细]
蜡笔小新 2024-11-29 07:50:02
本文详细探讨Java中Scanner类的两个重要方法——nextInt()和nextDouble(),并通过实例代码演示如何使用这些方法来处理用户输入。 ...
[详细]
蜡笔小新 2024-11-29 07:28:01
本文介绍了FTP(文件传输协议)的基础知识,包括其定义、如何通过TCP建立控制和数据连接,以及主动模式与被动模式的区别。FTP作为一种重要的文件传输协议,在互联网数据交换中扮演着关键角色。 ...
[详细]
蜡笔小新 2024-11-28 22:23:41
本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ...
[详细]
蜡笔小新 2024-11-28 22:05:47
近期在维护旧项目时遇到一个问题,在iOS8环境下,UILabel无法正常显示文本。通过深入分析,我们发现这一现象与UILabel的使用方式有关,特别是在嵌套UILabel的情况下。 ...
[详细]
蜡笔小新 2024-11-28 21:44:55
本文详细介绍了如何在华为交换机上配置VLAN间的通信,包括VLAN的创建、VLAN接口的配置以及Trunk和Access端口的设置。通过具体步骤指导读者完成网络配置,确保不同VLAN之间的设备能够互相访问。 ...
[详细]
蜡笔小新 2024-11-28 21:00:37