Android 自定义属性研究

        开发Android有一定时间的童鞋们,总会遇到这样一个问题,Android系统本身提供的控件的效果达不到我们项目中所要求达到的效果,需要我们自己去编写自定义的控件,以实现我们想要的效果,而在自定义控件中,或多或少我们要定义一些我们自定义控件所需要而Android系统本身又没有的属性(其实这才是我们要自定义控件的根本原因),那么,自定义属性的花,我们又该如何下手列?那就让我整个菜鸟级别攻略,与大家分享,如果又不对的地方,希望大家指出来,大家一起在讨论。


        首先,我们先看看系统已有的属性,在已有的控件里是怎么被使用的,了解这点是我们自定义属性的基础,就像我们学习编程语言时,我们一开始都是在学习编程语言的语法一样,只要我们知道了基础语法,我们就可以写出复杂的算法,ok,废话有点多,直接进入正题,那么我们就拿TextView为例:

        查看SDK中自定义的属性(目录:sdk\platforms\android-xx\data\res\values\attrs.xml),打开attrs.xml这个文件,我们会发现里面如下图:

152349_VoNd_2340651.png

        是吧,很熟悉是吧,跟网上很多大神写的自定义属性的xml文件里面是一样一样的,首先文件最外面是<resources>这个标签包含,表示这个文件里面的是一些资源,只要是资源类的东西,之后都会在我们工程里面的R文件中自动生成一个全局使用的id;

        然后我们再看看<declare-styleable>标签,这个我的理解是,它是一个盒子,把这一类的属性放在一起,它起到一个简化的作用,方便我们使用里面的属性(稍后会说明);

       <eat-comment>,这个标签是合并标签用的,我们自定义属性不会用到,可以忽略;

      <attr>,这个标签是我们这次的主角,我们自定义属性都是在重复编辑这个标签,这个标签我们主要看它的两个属性--name和format,name这个属性就是我们自定义属性的名字,我们在使用自定义属性的时候就利用这个去引用,attr标签的format属性的话是这个属性指的类型,比如TextView控件中的“text”这个属性,如下图:

155458_jqOd_2340651.png

它的format的值是string,意思是说,TextView这个控件的test接受一个字符串类型的值,去设置TextView要显示的内容。下面是format的类型列表:

   1、reference :参考某一资源ID       

    例子:

<attr name = "background" format = "reference" />

   2、color :颜色值类型              

    例子:

<attr name = "textColor" format = "color" />


   3、boolean:布尔值类型              

    例子:

<attr name = "focusable" format = "boolean" />


   4、dimension:尺寸值类型             

    例子:

<attr name = "layout_width" format = "dimension" />


   5、 float :浮点值类型           

    例子:

<attr name = "fromAlpha" format = "float" />


  6、integer:整型值类型           

    例子:

<attr name = "framesCount" format="integer" />


  7、fraction :百分数类型           

   例子:

<attr name = "pivotX" format = "fraction" />

    PS:format的类型可以设置多个,不同类型用“|”衔接;如果自定义的属性是引用系统现成的属性(当然这样也是可以的),format这个属性可以去掉。

   除了format,attr标签还有enum和flag两个属性:

   enum:枚举值                

   例子:

<attr name="orientation"> 
    <enum name="horizontal" value="0" /> 
    <enum name="vertical" value="1" /> 
</attr>



   flag:位或运算               

   例子:

<attr name="windowSoftInputMode"> 
    <flag name = "stateUnspecified" value = "0" /> 
    <flag name = "stateUnchanged" value = "1" /> 
</attr>


查看源码中的引用        

  上面介绍了属性xml里面的格式,那我们再来看看TextView的源代码是怎样使用这些个属性的:

  我们在使用TextView这个控件时,在布局是这样的:

  170425_liub_2340651.png


  然后是源码:

public TextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    
    ...
    /*
     * Look the appearance up without checking first if it exists because
     * almost every TextView has one and it greatly simplifies the logic
     * to be able to parse the appearance first and then let specific tags
     * for this View override it.
     */
    TypedArray a = theme.obtainStyledAttributes(
                    attrs, com.android.internal.R.styleable.TextViewAppearance, defStyle, 0);
}

    注意看上面这个构造方法,里面有个这样的参数:AttributeSet,从字面意思就应该知道,是的,我们的属性都包含在这里面,或者说,我们要通过这个去引用xml里面的属性,这个方法中有这么一句代码TypedArray a = theme.obtainStyledAttributes(attrs,com.android.internal.R.styleable.TextViewAppearance, defStyle, 0);是的,这里就是把attrs中所有的属性值取出来,放到TypedArray类型的a中,方便以后只用,这句代码里面有个com.android.internal.R.styleable.TextViewAppearance,其中有个styleable,是的,这个就是前面所说的,在xml里面定义的那个<declare-styleable>标签然后在R文件中生成的一个应用的类型了,然后在R中就会是下图中2这样,而不是想图中1那样散乱:

164416_djha_2340651.png

如果是不用<declare-styleable>标签包裹,也是可以的。

接着我们继续看源码,是怎样使用属性的,下面会有这么一段代码:

164918_NHMx_2340651.png

图中箭头的地方,就是在使用xml中的属性了,这里的源码因为是在遍历TypedArray中的所有属性,所以用到int attr = a.getIndex(i)。


我们自己的自定义属性:

以上便是系统本身属性的使用过程,那么我们自己自定义的属性的使用,其实也是这样的

1、按照attrs.xml的规则自定义属性:

165525_qWRx_2340651.png

然后在布局里面使用是这样的:

165718_4qme_2340651.png

我们自己写的属性的话,也可以用属性的名字去应用的,像下面这样:

165415_E99K_2340651.png

其中testAttr和text两个属性设置了值,然后在自定义的view里面可以在构造函数当中通过obtainStyledAttributes获取,这就是我们自定义属性的使用,是不是很简单?



转载于:https://my.oschina.net/u/2340651/blog/546889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值