博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android仅通过自定义属性id值获取样式自定义属性值
阅读量:4029 次
发布时间:2019-05-24

本文共 2429 字,大约阅读时间需要 8 分钟。

自定义样式属性的使用

自定义样式属性一般是使用在自定义UI控件中,自定义样式属性用来扩展UI控件的样式属性。

使用三步曲如下:
1.声明:自定义样式属性
2.使用:在layout文件使自定义控件时,设置自定义样式属性的值
3.解析:在自定义控件的样式属性解析时,读取自定义样式属性的值

声明自定义样式属性

在values.xml声明CommMyFragmentItem样式属性

使用自定义样式属性

* com.bank.mysdk.widget.CommMyFragmentItem是自定义UI控件,使用了 CommMyFragmentItem自定义属性 *

如下是一个layout文件中,使用自定义UI控件的同时设置自定义属性值
这里写图片描述
对应的layout文件的排版预览图如下
这里写图片描述

解析自定义样式属性

这里写图片描述

自定义样式属性的ID值数组

每个自定义属性在R文件会对应一个自定义属性ID值数组以及其在每个自定义属性ID值在数组中的索引,如下所示

这里写图片描述
* 注意观察R文件,如下图所示 *
这里写图片描述
自定义属性在资源文件(resources.arsc)的存放关系,如下图所示
这里写图片描述

通过自定义样式属性的ID值获取属性值

通地获取属性ID值获取资源

Resources提供了getIdentifier方法来获取资源id值,即可以不替换R.layout.xxx,R.id.xx的引用。如下为getIdentifier方法的说明

/**     * Return a resource identifier for the given resource name.  A fully     * qualified resource name is of the form "package:type/entry".  The first     * two components (package and type) are optional if defType and     * defPackage, respectively, are specified here.     *     * 

Note: use of this function is discouraged. It is much more * efficient to retrieve resources by identifier than by name. * * @param name The name of the desired resource. * @param defType Optional default resource type to find, if "type/" is * not included in the name. Can be null to require an * explicit type. * @param defPackage Optional default package to find, if "package:" is * not included in the name. Can be null to require an * explicit package. * * @return int The associated resource identifier. Returns 0 if no such * resource was found. (0 is not a valid resource ID.) */ public int getIdentifier(String name, String defType, String defPackage) { return mResourcesImpl.getIdentifier(name, defType, defPackage); }

如下为为使用事例

int mViewIdent = this.getResources().getIdentifier("item_fragment_my","layout", ContextUtil.getPackageName());int mIconIdent = this.getResources().getIdentifier("item_fragment_icon","id", ContextUtil.getPackageName());int mNameIdent = this.getResources().getIdentifier("item_fragment_name","id", ContextUtil.getPackageName());int mNextIdent = this.getResources().getIdentifier("item_fragment_next","id", ContextUtil.getPackageName());

在解析样式时使用依赖属性ID值

关键逻辑:

1. 分别读取各个属性对应的id值,并构造出自定义属性id值数组(自定义属性id值的数组);
2. 对自定义数组进行排序,这个排序能确保片定义属性id值跟他们在资源文件的排序是一致的,同时还要用于后面的计算属性id值在属性数组的索引(该索引主要用来读取属性值)
3. 计算属性值(id值)在属性id值数组的索引,并获取索引获取属性值(value值)
示例代码如下所示
这里写图片描述

你可能感兴趣的文章
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
jQuery性能优化指南
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
在CentOS 7系统上搭建LNMP 环境
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>