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


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

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

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

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

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

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

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

1、reference:参考某一资源ID

例子:

<attrname="background"format="reference"/>

2、color:颜色值类型

例子:

<attrname="textColor"format="color"/>


3、boolean:布尔值类型

例子:

<attrname="focusable"format="boolean"/>


4、dimension:尺寸值类型

例子:

<attrname="layout_width"format="dimension"/>


5、float:浮点值类型

例子:

<attrname="fromAlpha"format="float"/>


6、integer:整型值类型

例子:

<attrname="framesCount"format="integer"/>


7、fraction:百分数类型

例子:

<attrname="pivotX"format="fraction"/>

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

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

enum:枚举值

例子:

<attrname="orientation"><enumname="horizontal"value="0"/><enumname="vertical"value="1"/></attr>



flag:位或运算

例子:

<attrname="windowSoftInputMode"><flagname="stateUnspecified"value="0"/><flagname="stateUnchanged"value="1"/></attr>


查看源码中的引用

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

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


然后是源码:

publicTextView(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);.../**Looktheappearanceupwithoutcheckingfirstifitexistsbecause*almosteveryTextViewhasoneanditgreatlysimplifiesthelogic*tobeabletoparsetheappearancefirstandthenletspecifictags*forthisViewoverrideit.*/TypedArraya=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那样散乱:

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

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

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


我们自己的自定义属性:

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

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

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

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

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



更多相关文章

  1. Android中ContentProvider的实现及定义自己的ContentProvider
  2. android使用AttributeSet自定义控件
  3. android 的Application应用
  4. Android翻页效果原理实现之翻页的尝试
  5. 利用9-Patch PNG来实现ListView的圆角显示
  6. 关于在 Android(安卓)EditText 控件 中过滤空格或其他字符
  7. Android——控件跟随手指移动
  8. android 自定义视图控件开发
  9. Android(安卓)自定义适配器逐步优化

随机推荐

  1. Android source download for linux
  2. Android之封装好的异步网络请求框架
  3. Android 主界面 九宫格 超灵活的配置
  4. Android WiFi管理(WIFI_SERVICE)
  5. Android AApt错误
  6. android EditText控件设置只读
  7. Android进度条简单练习实例
  8. Android(安卓)ListView分页加载数据
  9. 网络编程
  10. android 读写文件