Android之自定义属性

有些时候会觉得Android中提供的控件不能满足项目的要求,所以就会常常去自定义控件。自定义控件就不免会自定义属性。自定义属性大致需要三个步骤:在XML文件中定义自定义属性的名称和数据类型、在布局中调用自定义属性、在代码中获取自定义属性。下面来详细的解析一下这三个步骤。

一、在XML文件中定义自定义属性的名称和数据类型

在项目的res/values文件夹下新建一个attrs.xml的文件,在文件中设置自定义属性的名称和类型。代码如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3     <declare-styleable name="ToolBar">
4         <attr name="buttonNum" format="integer"/>
5         <attr name="itemBackground" format="reference|color"/>
6     </declare-styleable>
7 </resources>

attrs.xml文件中的代码

这里需要注意以下几个问题:

1、这个文件是定义属性名和属性数据格式的地方,需要用<declare-styleable name="..."><declare-styleable/>标签包裹所有的自定义属性。在这个标签中,name是该属性集的名称,主要用途是标识该属性集。一个项目可以有多个自定义控件,但是只能有一个attrs.xml文件,所以,我们需要用一个标签来区别各个自定义控件的属性集。除了起到区分控件的作用,这个name还要在下面的第三个步骤中用到,即在JAVA代码中需要通过这个名字来取出这个属性。

2、在<declare-styleable>标签下,我们需要用<attr name="..." format="..."></attr>来定义属性及它们的数据类型。主要的数据类型有以下几种:string(字符串)、integer(整形,如12)、float(浮点型,如0.7)、dimension(尺寸,如10.0dip)、boolean(布尔型,如true)、reference(参考某一资源ID,如@string/app_name)、color(颜色代码,如#FF0000)、fraction(百分比,如200%)、enum(枚举)。

在上面这些类型中,需要我们注意的有两点:

(1)enum枚举类型的定义和其他类型数据的定义都不一样,enum类型数据的定义实例如下代码所示:

1 <declare-styleable name="ToolBar">
2         <attr name="orientation">
3                 <enum name="horizontal" value="0" />
4                 <enum name="vertical" value="1" />
5         </attr>
6 </declare-styleable>

枚举类型属性定义

(2)这些属性可以复合起来使用,像 <attr name="background" format="reference|color" /> 这样,表示可以传多种不同的值,即background这个属性既可以是某个已经定义了的值,也可以是某个现成的颜色。

二、在布局文件中调用自定义属性

在某个布局文件中使用自定义属性的代码如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar"
 5     android:layout_width="fill_parent"
 6     android:layout_height="fill_parent"
 7     >
 8     <cn.zzm.toolbar.ToolBar android:id="@+id/gridview_toolbar"
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:layout_alignParentBottom="true"
12         android:background="@drawable/control_bar"
13         android:gravity="center"
14         toolbar:buttonNum="5"
15         toolbar:itemBackground="@drawable/control_bar_item_bg"/>
16 </RelativeLayout>

布局文件的代码

这个步骤就是把第一步在attrs.xml文件中定义的自定义属性写到布局文件中。在这里我们依然需要注意几个问题:

1、我们需要首先声明一下这些自定义属性的命名空间(NameSpace)。我们通常使用的Android自带的属性都会以“android:”开头,所以我们会在每个布局文件的前面几行中看到这行代码: xmlns:android="http://schemas.android.com/apk/res/android" ,这表示声明一个命名空间,这个命名空间中的所有属性都用“android:”开头。因此,如果我们需要使用我们自己定义的属性,也需要在文件的开头定义这样一个类似的命名空间。在上面的代码中,我们定义的命名空间是这样的: xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar" ,这表示我们自定义的命名空间的名称叫toolbar,下面我们调用自定义属性的时候就需要在前面加上“toolbar:”前缀。

2、在我们自定义的命名空间中有这样一段代码:“cn.zzm.toolbar”,很多人认为这个是自定义控件所在的包名,实际上不是的,这里是主界面的java文件所在的包名,我们可以去项目的Menifest文件中(<menifest>标签中的package属性中的值)查看并拷贝。

3、命名空间的名称的命名是无限制的,我们可以随意制定,没有特定的规定,如上面代码中的toolbar。

4、在自定义控件中使用自定义属性时,我们需要通过我们上面定义的命名空间来找到这个属性,如: toolbar:buttonNum="5" 。

三、在代码中获取自定义属性的值

这个操作通常是在自定义控件的两个参数的构造方法或三个参数的构造方法中进行的。在JAVA代码中,我们要想获取自定义属性,就需要通过下面的代码来获取:

1 TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
2 buttonNum = a.getInt(R.styleable.ToolBar_buttonNum, 5);
3 itemBg = a.getResourceId(R.styleable.ToolBar_itemBackground, -1);
4 ......
5 a.recycle();

在Java代码中获取自定义属性的值

这里没什么好说的,仿照这段代码就可以取出自定义属性的值了。值得注意的是,我们在完成取值之后,需要把TypedArray释放掉,即这段代码中的 a.recycle(); 。

时间: 2024-08-05 19:33:32

Android之自定义属性的相关文章

Android中自定义属性(attrs.xml,TypedArray的使用)

做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方提供的那些组件一样用xml来定义他的属性呢?现在我们就来讨论一下他的用法.1.添加文件attrs.xml,位于res\values目录下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources>

Android中自定义属性基本步骤

Android中自定义属性基本步骤 这次只是说明最简单的自定义属性流程 1. 创建资源文件: resources/attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="test"> <attr name="test" format="string" /

关于Android attrs 自定义属性的说明

写个自定义控件时经常要自定义一些自己的属性,平时用的都是那几个,今天就顺便一起总结一下这个东东吧- 一.定义:属性的定义都在attrs.xml文件里面: 二.读取:通过都是通过TypedArray去读取的,要获取TypedArray都是通过context.obtainStyledAttributes去获取的,它有几个重载方法,一般形如: TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Custom

Android中自定义属性的格式详解

自定义属性格式一共有十种: 1. reference:参考某一资源ID. 2. color:颜色值. 3. boolean:布尔值. 4. dimension:尺寸值. 5. float:浮点值. 6. integer:整型值. 7. string:字符串. 8. fraction:百分数. 9. enum:枚举值. 10. flag:位或运算. 1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称">

Android中自定义属性的使用

做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方提供的那些组件一样用xml来定义他的属性呢?现在我们就来讨论一下他的用法. 一.在res/values文件下定义一个attrs.xml文件,代码如下: <?xml version="1.0" encoding="utf-8"?> <resources&

Android实现自定义属性

一.自定义ViewGroup 1.onMeasure 决定内部View(子View)的宽度和高度,以及自己的宽度和高度 2.onLayout 决定子View放置的位置 3.onTouchEvent 定义动作 二.自定义属性 在实际的使用自定义Viewgroup时,经常会用到自定义控件的属性. 在res/values文件夹下建立attr.xml文件 1.书写xml文件,定义<attr>中的自定义属性,在<declare-stableable>中声明已经定义的属性 2.使用自定义的属性

Android自定义控件——自定义属性

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39343401 我们在自定义android组件的时候,除了用Java构建出组件的样子外,有时候还需要去申明一些"属性"提供给项目使用,那么什么是组件的属性呢? 例如在清单文件中,创建一个TextView的时候,这是需要制定TextView的android:layout_width="wrap_content" android:layout_height

Android自定义属性:attr.xml 与 TypedArray

1.attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView"> <attr name="textColor" format="color" /> <attr name="textSize" format=&q

Android自定义属性

找到 "D:\eclispe_android\eclipse_en_32_4.4\sdk\platforms\android-22\data\res\values" Android SDK自带的属性文件,截取一段Android的自定义属性: <declare-styleable name="TextView"> <!-- Determines the minimum type that getText() will return. The defa