Android自定义控件的使用
可能是一直都在做Web的富客户端开发的缘故吧,在接触Android之后,发现其控件实在惨不忍睹(不知道是否说得过于偏激),我所说的惨不忍睹的意思不是说控件难看,Android的控件非常漂亮,这是我们公司公认的,但是最大的缺点在于控件功能非常弱小。弱小得一个Radio只能放一个text,而没有value(key)可以存放。这就是为什么我说惨不忍睹的原因。
但是这不能怪google,毕竟才刚刚发展起来,Android提供的只是一个最基本的控件实现,而非一个完整、强大的实现。可幸的是,Android提供了自定义控件的实现。有了自定义控件,我们就可以再Android的基础控件上实现我们想要的功能了。经过一天的摸索,我终于实现了我第一个自定义的组合控件——RadioButton组合RadioGroup!
下面我将带领大家进入Android自定义控件的世界。如果觉得我的文章能够帮助大家的话,请大方留下你的一些话语。因为你们的留言是我分享经验的精神源泉!谢谢!
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里面定义的属性绑定 */ [color=red]TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle();[/color] } catch (Exception e) { e.printStackTrace(); } } public RadioButton(Context context) { super(context); } }
<com.lg.base.view.RadioButton android:id="@id/isPayDepositTrue" [color=red]fsms:value="true"[/color] android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes" android:textSize="18sp"> </com.lg.base.view.RadioButton>
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="RadioButton"><!-- 控件名称--> <attr name="value" format="string"/><!-- 属性名称,类型--> </declare-styleable></resources>
/** * 跟values/attrs.xml里面定义的属性绑定 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle();
<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> <com.lg.base.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"> </com.lg.base.view.RadioButton></ScrollView>
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; }}android:layout_width="wrap_content" android:layout_height="wrap_content"