本系列大部分摘自eoe Android特刊19期。感谢eoe及其分享者。
自定义控件两种方式:1)在已有控件的基础上,通过重写相关方法来实现我们的需求;2)继承View类或ViewGroup类,来绘制我们的控件。
以下讲解均以实例为基础。
需求:RadioButton只能保存一个text,现在想存储key-value对应的键值对。
实现逻辑:先给RadioButton增加一个属性,然后让其可被外界访问。
代码实现:
public class MRadioButton extends RadioButton implements OnCheckedChangeListener{ private String mValue; public MRadioButton(Context context) { super(context); } public MRadioButton(Context context, AttributeSet attrs) { super(context, attrs); } public MRadioButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public String getmValue() { return mValue; } public void setmValue(String mValue) { this.mValue = mValue; } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { } }
Android提高的控件基本上都可以在xml中设置属性,但是上面的实现貌似不可以。
说人话:要实现上述,只需做三步:1)增加这个属性;2)告诉系统你有这个属性;3)使用这个属性。
1)增加这个属性:
即上面的getXX()、setXX()代码。
2)告诉系统你有:
先在values目录下创建attrs.xml:
<declare-styleable name="MRadioButton"> <attr name="value" format="string"/> </declare-styleable>外层name表示控件名称,内存name表示属性名称,format表示类型。
然后对自定义类做部分调整(attrs中添加的属性和代码中的属性绑定):
public MRadioButton(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.MRadioButton); this.mValue=a.getString(R.styleable.MRadioButton_value); this.invalidate(); a.recycle(); setOnCheckedChangeListener(this); }3)用这个属性:
先得用自己的命名空间路径,然后再使用自定义的属性。
xmlns:eoe="http://schemas.android.com/apk/res/com.example.mycontrol"
<com.example.mycontrol.MRadioButton android:id="@+id/mRb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" eoe:value="true" />