自定义view的基本步骤和思路

 1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value
                设计思路:新建一个类叫org.kandy.view.RadioButton,继承自android.wedget.RadioButton,重写父类的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的功能:加入一个属性value,用来存放RadioButtonkey
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组合控件的实现

                上面是自定义控件的实现,下面将要说的是组合控件的实现。在组合控件中,最经常用到的应该就是RadioGroupRadioButtonRadioButton的实现已经在上面介绍了。下面要介绍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)所选择的值;设置子控件要选择的值。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值