Android自定义控件(2)
2011-09-17 21:27
225 查看
上一篇的自定义控件并不能在xml中进行配置和初始化,这一篇将讲述如何和xml进行关联。
1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value。
设计思路:新建一个类叫org.kandy.view.RadioButton,继承自android.wedget.RadioButton,重写父类 的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的功能:加入一个属性value,用来存放RadioButton的 key。
代码如下:
红色代码可以先不看。先看我们新加入的属性value,由于Android习惯属性命名以m开头。所以我们自定义控件就按照这个规则来写。不过对于 setter、getter方法来说,不需要加入m。像上面的:属性名称 mValue,setter:setValue(),getter:getValue()。当然,你也可以不按照Android的习惯来命名。
这样,我们就可以使用这个自定义控件了。而且可以给它设置一个value,加上父类的text属性。我们就可以在RadioButton中加入key- value的键值了。当然,这里面的key对应是控件的value属性,value是对应控件的text属性。完了?没有。自定义控件才刚开始了。
2、XML中引用自定义控件
在XML中加入自定义控件其实很简单。只需要在控件名字前加入包名即可。如下:
同样,红色部分可以先不看,也不需要加入到代码中,这个时候加入会报错,请注意。
3、attrs.xml属性定义。
在我们的思想中,既然我在自定义控件中加入了一个新的属性,那么我就应该能够在xml中引用它,并对它赋初始值。我当初也是这样想的。可是却无从下手。就是这一点,折腾了我一个下午。
正解:res/values/attrs.xml中定义属性,在自定义控件中获取这个属性,然后跟自定义控件的属性相绑定。
attrs.xml如果没有,就新建一个。这里只存放自定义控件中需要的属性,在我看来,这个文件是一个中介,负责将layout/xx.xml里面的对这个变量的引用和自定义控件里面的属性绑定起来。
attrs.xml完整代码如下:
如果res下没有错误的话,在R中应该就会生成这些资源的id。这样我们就能在自定义控件中引用他们。
这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如 RatingBar的值可能是3.5颗星,boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当 然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有 dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj @drawable/xxx这样的类型。
当然什么时候用reference呢? 我们就以定义一个颜色为例子,
<attr name="red" format="color|reference" /> 这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用。
4、控件属性与XML定义绑定。
这下子我们又回到了自定义控件的编写上来了。先看看我们在第一点提到的红色字体部分。这一部分就是实现控件属性与XML定义绑定的代码。
TypedArray其实就是一个存放资源的Array,首先从上下文中获取到R.styleable.RadioButton这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable.RadioButton_value);这句代码就是获取attrs.xml中定义的属性,并将这个属 性的值传给本控件的mValue.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束。
5、在xml中对控件赋初始值。
请看第2点,绑定结束后可以在需要赋初始值的地方赋值。
红色部分首先声明命名空间。命名空间为fsms.路径是http://schemas.android.com/apk/res/这一部分是不变的,后面接的是R的路径:org.kandy.R。然后在自定义控件的xml描述中就可以这样使用fsms:value="true"。这样就实现了自定义控件的初始化赋值。
1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value。
设计思路:新建一个类叫org.kandy.view.RadioButton,继承自android.wedget.RadioButton,重写父类 的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的功能:加入一个属性value,用来存放RadioButton的 key。
代码如下:
public class RadioButton extends android.widget.RadioButton { private String mValue; public RadioButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public String getValue() { return this.mValue; } public void setValue(String value) { this.mValue = value; } public RadioButton(Context context, AttributeSet attrs) { super(context, attrs); try { /** * 跟values/attrs.xml里面定义的属性绑定 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle(); } catch (Exception e) { e.printStackTrace(); } } public RadioButton(Context context) { super(context); } }
红色代码可以先不看。先看我们新加入的属性value,由于Android习惯属性命名以m开头。所以我们自定义控件就按照这个规则来写。不过对于 setter、getter方法来说,不需要加入m。像上面的:属性名称 mValue,setter:setValue(),getter:getValue()。当然,你也可以不按照Android的习惯来命名。
这样,我们就可以使用这个自定义控件了。而且可以给它设置一个value,加上父类的text属性。我们就可以在RadioButton中加入key- value的键值了。当然,这里面的key对应是控件的value属性,value是对应控件的text属性。完了?没有。自定义控件才刚开始了。
2、XML中引用自定义控件
在XML中加入自定义控件其实很简单。只需要在控件名字前加入包名即可。如下:
<org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes" android:textSize="18sp"> </org.kandy.view.RadioButton>
同样,红色部分可以先不看,也不需要加入到代码中,这个时候加入会报错,请注意。
3、attrs.xml属性定义。
在我们的思想中,既然我在自定义控件中加入了一个新的属性,那么我就应该能够在xml中引用它,并对它赋初始值。我当初也是这样想的。可是却无从下手。就是这一点,折腾了我一个下午。
正解:res/values/attrs.xml中定义属性,在自定义控件中获取这个属性,然后跟自定义控件的属性相绑定。
attrs.xml如果没有,就新建一个。这里只存放自定义控件中需要的属性,在我看来,这个文件是一个中介,负责将layout/xx.xml里面的对这个变量的引用和自定义控件里面的属性绑定起来。
attrs.xml完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RadioButton"><!– 控件名称–> <attr name="value" format="string"/><!– 属性名称,类型–> </declare-styleable> </resources>
如果res下没有错误的话,在R中应该就会生成这些资源的id。这样我们就能在自定义控件中引用他们。
这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如 RatingBar的值可能是3.5颗星,boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当 然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有 dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj @drawable/xxx这样的类型。
当然什么时候用reference呢? 我们就以定义一个颜色为例子,
<attr name="red" format="color|reference" /> 这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用。
4、控件属性与XML定义绑定。
这下子我们又回到了自定义控件的编写上来了。先看看我们在第一点提到的红色字体部分。这一部分就是实现控件属性与XML定义绑定的代码。
/** * 跟values/attrs.xml里面定义的属性绑定 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle();
TypedArray其实就是一个存放资源的Array,首先从上下文中获取到R.styleable.RadioButton这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable.RadioButton_value);这句代码就是获取attrs.xml中定义的属性,并将这个属 性的值传给本控件的mValue.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束。
5、在xml中对控件赋初始值。
请看第2点,绑定结束后可以在需要赋初始值的地方赋值。
<ScrollView android:layout_width="fill_parent"
android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fsms=http://schemas.android.com/apk/res/org.kandy>
<org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes" android:textSize="18sp"> </org.kandy.view.RadioButton>
</ScrollView>
红色部分首先声明命名空间。命名空间为fsms.路径是http://schemas.android.com/apk/res/这一部分是不变的,后面接的是R的路径:org.kandy.R。然后在自定义控件的xml描述中就可以这样使用fsms:value="true"。这样就实现了自定义控件的初始化赋值。
相关文章推荐
- Android给自定义控件添加自定义属性
- Android 自定义控件打造史上最简单的侧滑菜单02
- Android自定义控件:动画类(八)----ObjectAnimator基本使用
- android自定义控件(三) 增加内容 自定义属性 format详解
- android自定义控件系列
- Android自定义控件的学习心得
- Android自定义控件-(1)
- Android自定义控件-EditText(可用于登陆界面)
- android 自定义控件(二)
- Android自定义控件时钟效果
- Android开发——Fragment、菜单、自定义控件
- android自定义View之(七)------自定义控件组合仿actionbar控件
- Android自定义控件集合
- Android 自定义控件打造史上最简单的侧滑菜单
- android自定义控件
- Android自定义控件(一)
- Android--自定义控件解析(一)
- android之自定义控件一控件的呈现机制
- Android自定义控件,旋转头像直接用在你的项目中(酷毙了)
- android动画入门,进阶,提高----自定义控件绘图篇和Path之贝赛尔曲线