自定义控件(attrs定义属性的使用)

这里为了演示使用自定义变量,字体大小改用自定义的属性。

首先要创建变量,创建了个values/attrs.xml文件,文件名任意,但是要在values目录下:

<?xmlversion="1.0"encoding="utf-8"?>

<resources>

<declare-styleablename="button">

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

</declare-styleable>

</resources>

根标签要是resources,定义的变量要有个名字,declare-styleablename="button">,这里定义名称为button。在这个名称里,可以有多个自定义属性。定义了个名为textSize的属性,格式是dimension,这个format指定了textSize属性的类型,只能用于定义字体大小。

在布局文件中通过自定义属性赋值:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:myapp="http://schemas.android.com/apk/res/com.easymorse.textbutton"

android:orientation="vertical"android:layout_width="fill_parent"

android:layout_height="fill_parent"android:background="@drawable/background_color">

<LinearLayoutandroid:layout_width="fill_parent"

android:layout_height="10dip"/>

<LinearLayoutandroid:layout_width="fill_parent"

android:layout_height="40dip">

<com.easymorse.textbutton.TextButton

android:layout_width="fill_parent"android:layout_height="fill_parent"

android:layout_weight="1"android:text="电影"

android:gravity="center_vertical|center_horizontal"

android:background="@drawable/button"android:focusable="true"

android:clickable="true"myapp:textSize="20sp"/>

这里在根标签中增加了:

xmlns:myapp=http://schemas.android.com/apk/res/com.easymorse.textbutton

声明了myapp这个名字空间,myapp是任意的名称,自己可以随便起名,后面的:

http://schemas.android.com/apk/res/

是固定的。再后面接的是应用的包名。

在下面自定义按钮中的:myapp:textSize,就是使用<attrname="textSize"这个变量了,给变量赋值。

还需要一个过程,就是在程序中获取到这个赋值:

publicTextButton(finalContextcontext,AttributeSetattrs){

this(context,attrs,0);

TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.button);

this.setTextSize(typedArray.getDimension(R.styleable.button_textSize,15));

typedArray.recycle();

其中,TypedArray实例是个属性的容器,context.obtainStyledAttributes()方法返回得到。AttributeSet是节点的属性集合,在本例中是<com.easymorse.textbutton.TextButton节点中的属性集合。

这句话:

typedArray.getDimension(R.styleable.button_textSize,

15)

将获取自定义textSize的值,如果没有,则使用默认的值,15。

最后别忘记调用:

typedArray.recycle();

作用是:

GivebackapreviouslyretrievedStyledAttributes,forlaterre-use.

这里的自定义属性的format,可以有很多种:

reference

string

color

dimension

boolean

integer

float

fraction

enum

flag