问题背景
在自定义的控件中,原有的自带属性可能无法满足自己的需求,这时候就需要自定义属性
解决方案
自定义属性一般分为以下 个步骤:
- 编写自定义属性的xml文件
参照Android源码中属性定义的方法编写xml文件,Android源码中属性集文件的路径如下:你的安卓SDK路径\Sdk\platforms\android-24\data\res\values\attrs.xml
,参照TextView的属性编写样例
<declare-styleable name="TextView">
<!-- Determines the minimum type that getText() will return.
The default is "normal".
Note that EditText and LogTextBox always return Editable,
even if you specify something less powerful here. -->
<attr name="bufferType">
<!-- Can return any CharSequence, possibly a
Spanned one if the source text was Spanned. -->
<enum name="normal" value="0" />
<!-- Can only return Spannable. -->
<enum name="spannable" value="1" />
<!-- Can only return Spannable and Editable. -->
<enum name="editable" value="2" />
</attr>
<!-- Text to display. -->
<attr name="text" format="string" localization="suggested" />
<!-- Hint text to display when the text is empty. -->
<attr name="hint" format="string" />
<!-- Text color. -->
<attr name="textColor" />
<!-- Color of the text selection highlight. -->
<attr name="textColorHighlight" />
<!-- Color of the hint text. -->
...
</declare-styleable>
其中的根标签是<resource></resource>
首先在项目的res/values目录下创建一个attrs.xml的文件
然后按照自己的要求填写属性值,样例如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SettingItemView">
<attr name="desTitle" format="string"/>
<attr name="desOn" format="string"/>
<attr name="desOff" format="string"/>
</declare-styleable>
</resources>
其中<declare-styleabel>
标签中的name
表示你自定义控件的名称,即自定义控件的Java文件的类名
其他的format
根据实际情况填写,一般有string
,integer
,boolean
等。代表该属性取值的数据类型
-
在自定义控件中定义名字空间
在使用自定义控件的layout文件中,定义该控件的名字空间
在布局文件中根标签的属性一般都会包含一个xmlns:android="http://schemas.android.com/apk/res/android"
这样的名字空间,其中xmlns
就是xml name space
的简写,代表所有类似于androir:xxx=xxx
的属性都存放在这个名字空间中。
我们如果需要使用自定义的属性,就需要填写自己的名字空间,在布局文件的根标签中添加一行xmlns:app="http://schemas.android.com/apk/res-auto"
这样我们就可以使用app:attr=values
的方法来使用自定义的属性了 -
在自定义控件中引入自定义属性
完成了以上两步,我们就可以在自定义控件中像使用原生属性一样使用自定义的属性了。使用方法就是app:attr_name=attr_values
,比如我们在第一步中定义的desTitle属性,就可以这样使用app:desTitle=我是自定义的title
。 -
在自定义控件的构造方法中使用自定义属性
自定义属性的获取有2个常用的APIgetAttributeValue(int index)
和getAttributeValue(String namespace, String attr_name)
。
index
参数,根据索引返回对应的属性值(自定义空间中有多少属性,index的值就是多少)namespace
参数就是我们在第二步自定义的名字空间常量"http://schemas.android.com/apk/res/android"
,attr_name
参数是我们自定义的属性名,该API返回对应属性名的属性值
结束
至此,自定义控件的自定义属性方法就介绍完了,在后续的使用过程中如果有变化我还会更新该篇博文。