在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 格式的资源文件来声明与定义各种类型的数组。