Android中自定义控件的自定义属性的方法

问题背景

在自定义的控件中,原有的自带属性可能无法满足自己的需求,这时候就需要自定义属性

解决方案

自定义属性一般分为以下 个步骤:

  1. 编写自定义属性的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等。代表该属性取值的数据类型

  1. 在自定义控件中定义名字空间
    在使用自定义控件的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的方法来使用自定义的属性了

  2. 在自定义控件中引入自定义属性
    完成了以上两步,我们就可以在自定义控件中像使用原生属性一样使用自定义的属性了。使用方法就是app:attr_name=attr_values,比如我们在第一步中定义的desTitle属性,就可以这样使用app:desTitle=我是自定义的title

  3. 在自定义控件的构造方法中使用自定义属性
    自定义属性的获取有2个常用的API getAttributeValue(int index)getAttributeValue(String namespace, String attr_name)

  • index参数,根据索引返回对应的属性值(自定义空间中有多少属性,index的值就是多少)
  • namespace参数就是我们在第二步自定义的名字空间常量"http://schemas.android.com/apk/res/android"
  • attr_name参数是我们自定义的属性名,该API返回对应属性名的属性值

结束

至此,自定义控件的自定义属性方法就介绍完了,在后续的使用过程中如果有变化我还会更新该篇博文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值