189 8069 5689

android自定属性,安卓 所有控件通用自定义属性

自定义 view - 自定义属性

自定义 view 里面自定义属性是常常会用到的,大家必须做到熟练使用,但是奈何谁都有忘的时候,临时找别人的看着不爽,还是决定自己写一篇出来

创新互联是专业的萧县网站建设公司,萧县接单;提供网站设计、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行萧县网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

attr 是 values 目录下的资源文件,新建项目是没有 attr 文件的,我们自己新建一个出来放到 values 里面就行,注意名字别写错

attr 中的自定义属性样式

Android 项目只有一个 attr.xml 文件,所有的自定义属性都写在一起,为了方便 attr 中的自定义属性以所在 view 分组存放。其中 MyView 就是这个 view 的名字,以 declare-styleable 为标签,里面自然就是一个个自定义属性啦

细心的朋友可以发现,自定义 view 可以指定不同的数据类型,Android 中自定义属性支持的数据类型还是挺多的,详细见下表:

我这markdown 写表格bug ,所以直接用被人的图,我再补充一下:

按照下面这样写就性,enum 就能看出来这是枚举

window 会解析整个视图树并对象化,然后把每个 view 在 xml 中的属性发包成一个结合传递给相关的 view ,这个属性集合就是 TypedArray 了,我们在 view 的构造函数中可以获取 TypedArray

有一点要注意,自定义属性的 id 是系统自动生成的,id = 自定义属性组名 + "_" + 自定义属性名,例如:

MyView 是自定义属性组名,name 是自定义属性名

获取自定义参数

我更喜欢称attr 的引用空间为资源引用地址,这块其实很简单,基本用不着我们自己写,1.0.1 版本的 AS 工具直接就帮你写好了,但是具体的我们还是要知道的,这里可能能会出问题,明白原理我们才能处理问题

理论上 attr 的命名空间是 " " + 应用包名,比如例子中应该写成这样:

系统自带的属性后面直接跟 android

但是呢还是推荐使用 AS 工具推荐的方法,只写一个命名空间,可以包含所有的自定义属性

不推荐因为多个 view 写多个 命名空间,可能会引发混乱或是替代

有的朋友说我在 xml 里面怎么不能自动提示自定义 view 呢,其实着就像我们使用 R 文件的引用一样,我们得先 rebuild / 重启, 告知系统才行,要不系统怎么知道有什么呢

日过我们能像使用系统属性那样,使用自定义属性,那么将会是十分友好的,感官上非常 Nice,就像下面这样

上面我们可以让自定义 view 的自定义属性使用系统默认的属性,但是一旦view 设置了通用的 style 样式,那我们处理呢,也好办

获取在带样式的构造函数中获取参数

Android自定义属性TypedArray详解

大家好,我是程序员双木L,后续会发专题类的文章,这是自定义控件的第一篇,之后也会陆续更新相关的文章,欢迎关注。

自定义属性在自定义控件过程中属于比较常见的操作,我们可以回想一下这样的场景:自定义view的过程中,我们需要在不同的情况下设置不同的文字大小,那么我们是不是就需要提供对外的方法来设置,这样就比较灵活操作。而我们自定义对外的方法,就是我们自定义的属性啦,那我们来分析一下其原理及作用。

下面我们根据例子来进行分析:

1、首先我们需要在res-values目录下新建attrs.xml文件,该文件就是用来声明属性名及其接受的数据格式的,如下:

attr名词解析:

name表示属性名,上面的属性名是我自己定义的。

format表示接受的输入格式,format格式集合如下:

2、自定义属性的使用,这里我们使用两种方式进行对比解析

最最最原始的使用方式

(1)、自定义文件如下:

我们可以在TestAttrsView方法的参数AttributeSet是个xml解析工具类,帮助我们从布局的xml里提取属性名和属性值。

(2)、在布局文件xml中的使用

这里使用自定义属性需要声明xml的命名空间,其中app是命名空间,用来加在自定义属性前面。

xmlns:app=" "

声明xml命名空间,xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名。

schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签)、

元素有哪些属性及各元素的关系,当然从面向对象的角度理解schemas文件可以

认为它是被约束的xml文档的“类”或称为“模板”。

(3)、将属性名与属性值打印结果如下:

从打印结果我们可以看出,AttributeSet将布局文件xml下的属性全部打印出来了,细心的童鞋可能已经看出来:

这个属性我们设置的是一个整数尺寸,可最后打印出来的是资源编号。

那如果我们想要输出我们设置的整数尺寸,需要怎么操作呢?

这个时候就该我们这篇的主角出场了,使用TypedArray方式。

(1)、这里我们需要将attrs.xml使用“declare-styleable”标签进行改造,如下:

从改造后的attrs文件可以看出,我们将属性声明归结到TestStyleable里面,也就意味着这些属性是属于TestStyleable下的。

(2)、属性的解析:

这里我直接打印出解析结果,这里可以获取我们想要的自定义属性,而系统有的属性可以忽略。

(3)、运行结果如下

从解析的结果可以看出,尺寸的结果已经转换为实际值了:

这个时候有童鞋又问了,我设置的是15dp,为啥最后打印是41.25了呢?其实解析出来的值单位是px,所以这里输出的是转换后的值。

解析的过程中用到了这个方法:

我们来看一下这个方法的源码:

源码中我们可以看到这个方法有两个参数:

obtainStyledAttributes方法返回值类型为TypedArray。该类型记录了获取到的属性值集合,而通过数组下标索引即可找到对应的属性值。索引下标通过R.styleable.TestStyleable_xx获取,"xx"表示属性名,一般命名为"styleable名" + "_" + "属性名"。

而TypedArray提供了各种Api,如getInteger,getString,getDimension等方法来获取属性值,这些方法都需要传入对应属性名在obtainStyledAttributes中的int数组的位置索引,通过下标获取数组里属性值。

这个TypedArray的作用就是资源的映射作用,把自定义属性在xml设置值映射到class,这样怎么获取都很简单啦。

到这里就分析完啦!

自定义组件之自定义属性

我们在布局文件中使用组件时,定义组件的宽、高、背景等属性,这些属性我们并没有特意去定义,它们都是组件的默认属性,在我们sdk安装目录下找到:

sdk\platforms\android-25\data\res\values\attrs.xml .

这里面定义了组件的默认属性,例如View的属性:

在自定义组件时,我们常常需要自定义属性,自定义属性主要有 3 个步骤:

(1)自定义的属性都放在declare-styleable标签中,该标签的name一般都是自定义组件的名称,此处为XView,也可以取别的名字,但是和自定义组件一个名字通俗易懂.

(2)自定义的属性由2部分组成:属性名name、属性类型format,属性类型一共有下面几种:

使用自定义属性需要导入命名空间,上面有2个命名空间:

第1个是Android本身的,如果没有的话就不能使用组件的默认属性了,第2个是我们自定义属性的.

(1)xmlns后面的android、app是空间名称,我们在设置属性时的前缀就是这个

(2)后面的res/android、res-auto表明属性的出处,前者是android本身的,后者是AndroidStudio里面自定义属性固定的写法.

上面写了如何自定义属性、如何使用,但是你肯定疑惑为什么这么写,下面就介绍上面写法的原因.

构造方法中有个参数AttributeSet,之前介绍过,它表示属性集,我们为该组件定义的所有属性都保存在其中,拿上面的XView示例:

结合Log一看就明白了,AttributeSet 中还有一些其它的方法,感兴趣的可以去看看.

(1)获取TypedArray对象

TypedArray是一个数组容器,这个容器中装有Context.obtainStyledAttributes( )方法获取到的属性值.

在获取TypedArray时,一共4个重载方法,我们来看最长的一个:

(2)读取属性值

获取到TypedArray对象之后,我们就可以根据TypedArray一系列getXXX( )方法获取到属性值.比如上面的:

TypedArray中定义了很多getXXX( )方法,XXX是我们定义的属性类型,有些方法有1个参数,有些方法有2个参数,第1个参数是索引值,第2个参数是默认值.

(3)释放资源

使用完TypedArray之后需要调用recycle( )方法释放资源.

根据int[]类型数组R.styleable.XView获取TypedArray 对象

根据数组元素索引R.styleable.XView_attr1、R.styleable.XView_attr2获取属性值

attrs.xml:

布局文件:

XView:

这里自定义了一个十分简陋的“TextView”,很多东西都没有考虑,不过不要紧,这里主要是让大家明白自定义属性如何定义、使用而已.


新闻名称:android自定属性,安卓 所有控件通用自定义属性
文章起源:http://jkwzsj.com/article/dsijjhj.html

其他资讯