android 自定义属性

您所在的位置:网站首页 安卓控件属性 android 自定义属性

android 自定义属性

2023-11-16 17:50| 来源: 网络整理| 查看: 265

今天,简单讲讲android里如何自定义属性。

这个其实我本来是想和自定义控件一起讲的,不过最近看一些自定义控件的代码时,老是因为没有完全理解自定义属性,导致看代码花费过多的时间,所以还是决定提前把这个内容讲一下。自定义属性对于自定义控件是一个基础,所以在网上搜索资料,把这个内容整理一下。这里记录一下。

一般情况下,我们自定义一个View的时候往往会重载它的三个构造函数,如下:

public class CustomView extends View { public CustomView(Context context) { this(context, null); } public CustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }

下面针对这三个构造函数,我们来一一讲解: 1、public CustomView(Context context)

这个构造函数一般在代码中来定义这个CustomView对象的时候会被调用,例如:

CustomView customView = new CustomView(context);

2、public CustomView(Context context, AttributeSet attrs)

这个构造函数一般是在布局文件中使用这个CustomView的时候会被调用,AttributeSet对应的就是设置的属性值集合,例如:

3、public CustomView(Context context, AttributeSet attrs, int defStyleAttr)

这个构造函数一般是被第一个或者第二个构造函数来调用,它的作用是当没有为自定义的属性赋值的时候,就可以使用defStyleAttr里面定义的默认属性值。

简单讲讲,其实自定义控件的构造函数对应控件不同的创建方式。具体可以看之前的代码。

1. 为什么要自定义属性

  要使用属性,首先这个属性应该存在,所以如果我们要使用自己的属性,必须要先把他定义出来才能使用。但我们平时在写布局文件的时候好像没有自己定义属性,但我们照样可以用很多属性,这是为什么?我想大家应该都知道:系统定义好的属性我们就可以拿来用呗,但是你们知道系统定义了哪些属性吗?哪些属性是我们自定义控件可以直接使用的,哪些不能使用?什么样的属性我们能使用?这些问题我想大家不一定都弄得清除,下面我们去一一解开这些谜团。   系统定义的所有属性我们可以在\sdk\platforms\android-xx\data\res\values目录下找到attrs.xml这个文件,这就是系统自带的所有属性,打开看看一些比较熟悉的:

... ... ... ...

看看上面attrs.xml文件中的属性,发现他们都是有规律的分组的形式组织的。以declare-styleable 为一个组合,后面有一个name属性,属性的值为View 、TextView 等等,有没有想到什么?没错,属性值为View的那一组就是为View定义的属性,属性值为TextView的就是为TextView定义的属性…。

  因为所有的控件都是View的子类,所以为View定义的属性所有的控件都能使用,这就是为什么我们的自定义控件没有定义属性就能使用一些系统属性。

  但是并不是每个控件都能使用所有属性,比如TextView是View的子类,所以为View定义的所有属性它都能使用,但是子类肯定有自己特有的属性,得单独为它扩展一些属性,而单独扩展的这些属性只有它自己能有,View是不能使用的,比如View中不能使用android:text=“”。又比如,LinearLayout中能使用layout_weight属性,而RelativeLayout却不能使用,因为layout_weight是为LinearLayout的LayoutParams定义的。

  综上所述,自定义控件如果不自定义属性,就只能使用VIew的属性,但为了给我们的控件扩展一些属性,我们就必须自己去定义。

2. 怎样自定义属性

  翻阅系统的属性文件,你会发现,有的这中形式,有的是;这两种的区别就是attr标签后面带不带format属性,如果带format的就是在定义属性,如果不带format的就是在使用已有的属性,name的值就是属性的名字,format是限定当前定义的属性能接受什么值。

  打个比方,比如系统已经定义了android:text属性,我们的自定义控件也需要一个文本的属性,可以有两种方式:

第一种:我们并不知道系统定义了此名称的属性,我们自己定义一个名为text或者mText的属性(属性名称可以随便起的)

为什么系统定义了此属性,我们在使用的时候还要声明?因为,系统定义的text属性是给TextView使用的,如果我们不申明,就不能使用text属性。

3. 属性值的类型format

format支持的类型一共有11种: (1). reference:参考某一资源ID

属性定义:

属性使用:

(2). color:颜色值

属性定义:

(3). boolean:布尔值

属性定义: 属性使用:

(4). dimension:尺寸值

属性定义:


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3