自定义Android组件之带图像的TextView
2010-05-14 16:36:00 来源:WEB开发网在本例中要实现一个可以在文本前方添加一个图像(可以是任何Android系统支持的图像格式)的 TextView组件。在编写代码之前,先看一下Android组件的配置代码。
XML/HTML代码< TextView android:id="@+id/textview1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="textview1" / > ght="fill_parent" >
LinearLayout >
上面的代码配置了一个标准的TextView组件。在这段代码中主要有两部分组成:组件标签()和标签属性(android:id、android:layout_width等)。需要注意的是,在所有的标签属性前面都需要加了一个命名空间(android)。实际上,android命名空间的值是在Android系统中预定义的,所有Android系统原有的组件在配置时都需要在标签属性前加android。 对于定制组件,可以有如下3种选择。
1. 仍然沿用android命名空间。
2. 改用其他的命名空间。
3. 不使用命名空间。
虽然上面3种选择从技术上说都没有问题,但作者建议使用第2种方式(尤其是对外发布的组件),这是因为在使用定制组件时,可能需要指定相同名称的属性,在这种情况下,可以通过命名空间来区分这些属性,例如,有两个命名空间:android和mobile,这时可以在各自的命名空间下有相同名称的属性,如 android:src和mobile:src。在本例中定义了一个mobile命名空间,因此,在配置本例实现的组件时需要在属性前加mobile。
实现定制组件的一个重要环节就是读取配置文件中相应标签的属性值,由于本例要实现的组件类需要从TextView类继承,因此,只需要覆盖 TextView类中带AttributeSet类型参数的构造方法即可,该构造方法的定义如下:
复制到剪贴板 Java 代码public TextView(Context context, AttributeSet attrs)
在构造方法中可以通过AttributeSet接口的相应getter方法来读取指定的属性值,如果在配置属性时指定了命名空间,需要在使用getter 方法获得属性值时指定这个命名空间,如果未指定命名空间,则将命名空间设为null即可。
IconTextView是本例要编写的组件类,该类从TextView继承,在onDraw方法中将TextView中的文本后移,并在文本的前方添加了一个图像,该图像的资源ID通过mobile:iconSrc属性来指定。IconTextView类的代码如下:
复制到剪贴板 Java代码package net.blogjava.mobile.widget;
更多精彩
赞助商链接