自定义组件,AttributeSet和TypedArray的关系

           在android自定义组件中用到了TypedArray类,这是什么类呢?

           谈谈我的理解,请大家指点

           程序和xml之间肯定时需要数据交换的,而AttributeSet就是一个辅助类,此类仅仅时为了解析xml所用。AttributeSet对象一般时作为View的构造函数作为参数传递进来,我们只需要在构造函数中通过对象获取相应的属性值即可,这一参数包含了一个XML元素中所有定义的所有属性,比如字体大小,控件宽度,高度这些属性。这也就是为什么在我们自定义组件时,必须要实现的这一个构造函数-->public MyView(Context context, AttributeSet attrs){}。

           另外,styeable用于自定义一些属性,系统会把R.Styeable.XXX编译为一个int[]数组,该数组所包含的内容正是styeable中所包含的attr对应的id,它代表了我们想要获取的属性。

           而TypedArray又是对AttributeSet数据类又一封装。例如android:id="@+id/hellID",当获取AttributeSet属性时,得到的数据是@+id/hellID,而用TypedArray获得的数据就是helllD。

           TypedArray就是为了获取自定义的属性。因为像layout_width, layout_height等这种属性我们通过代码很容易获得,android已经给我们封装好了,唯独自定义的只有自己动手了。如下:

///获得对属性集的引用,然后就可以用"typedArray"的各种方法来获取相应的属性值
		TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.myCon);
		this.textViewString = typedArray.getString(R.styleable.myCon_what);

          以上代码中R.styleable.myCon所包含的就是我们自定义的属性,系统帮我们自动生成一个myCon_what常量,其值为what在myCon中的位置,引用时使用R.styeable.myCon_what。

        还有个重要问题:Android通过xml资源文件定义数组并在代码中访问。

字符串数组
XML

<string-array name="sample_names">
	<item>foo</item>
	<item>bar</item>
	<item>baz</item>
</string-array>
JAVA
String[] names = getResources().getStringArray(R.array.sample_names);
整形数组
XML
<integer-array name="sample_ids">
	<item>1</item>
	<item>2</item>
	<item>3</item>
</integer-array>

JAVA
int[] ids = getResources().getStringArray(R.array.sample_ids);
Drawable 数组
XML
<array name="sample_images">
	<item>@drawable/title</item>
	<item>@drawable/logo</item>
	<item>@drawable/icon</item>
</array>

JAVA
TypedArray images = getResources().obtainTypedArray(R.array.sample_images);
Drawable drawable = images.getDrawable(0);

Color 数组
XML
<array name="sample_colors">
	<item>#FFFF0000</item>
	<item>#FF00FF00</item>
	<item>#FF0000FF</item>
</array>
JAVA
TypedArray colors = getResources().obtainTypedArray(R.array.sample_colors);
int color = colors.getColor(0,0);// 参数分别为下标,第二个值为默认值

说明:Android 可以通过 xml 格式的资源文件来声明与定义各种类型的数组。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值