1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value。
设计思路:新建一个类叫org.kandy.view.RadioButton,继承自android.wedget.RadioButton,重写父类的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的功能:加入一个属性value,用来存放RadioButton的key。
这样,我们就可以使用这个自定义控件了。而且可以给它设置一个value,加上父类的text属性。我们就可以在RadioButton中加入key-value的键值了。当然,这里面的key对应是控件的value属性,value是对应控件的text属性。完了?没有。自定义控件才刚开始了。
2、XML中引用自定义控件
在XML中加入自定义控件其实很简单。只需要在控件名字前加入包名即可。如下:
正解:res/values/attrs.xml中定义属性,在自定义控件中获取这个属性,然后跟自定义控件的属性相绑定。attrs.xml如果没有,就新建一个。这里只存放自定义控件中需要的属性,在我看来,这个文件是一个中介,负责将layout/xx.xml里面的对这个变量的引用和自定义控件里面的属性绑定起来。
attrs.xml完整代码如下:
4、RadioGroup、RadioButton组合控件的实现
上面是自定义控件的实现,下面将要说的是组合控件的实现。在组合控件中,最经常用到的应该就是RadioGroup和RadioButton。RadioButton的实现已经在上面介绍了。下面要介绍RadioGroup的自定义控件和功能扩展:
RadioGroup只做两件事:获取子控件(RadioButton)所选择的值;设置子控件要选择的值。
设计思路:新建一个类叫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);
}
}
由于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属性定义
正解: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>
4、RadioGroup、RadioButton组合控件的实现
上面是自定义控件的实现,下面将要说的是组合控件的实现。在组合控件中,最经常用到的应该就是RadioGroup和RadioButton。RadioButton的实现已经在上面介绍了。下面要介绍RadioGroup的自定义控件和功能扩展:
public class RadioGroup extends android.widget.RadioGroup {
private String mValue;
public RadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RadioGroup(Context context) {
super(context);
}
// 设置子控件的值
public void setChildValue(){
int n = this.getChildCount();
for(int i=0;i<n;i++){
final RadioButton radio = (RadioButton)this.getChildAt(i);
if(radio.getValue().equals(this.mValue)){
radio.setChecked(true);
}else{
radio.setChecked(false);
}
}
}
// 获取子类的值
public void getChildValue(){
int n = this.getChildCount();
for(int i=0;i<n;i++){
RadioButton radio = (RadioButton)this.getChildAt(i);
if(radio.isChecked()){
this.mValue=radio.getValue();
}
}
}
public void setValue(String value) {
this.mValue = value;
setChildValue();
}
public String getValue(){
getChildValue();
return this.mValue;
}
}
RadioGroup只做两件事:获取子控件(RadioButton)所选择的值;设置子控件要选择的值。