下面是给已有控件加属性的例子,选择继续已有控件的方式。
方式一:
第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值。
方式二:通过自定义attrs.xml来实现,在代码中使用context.obtainStyledAttributes获得属性值。
下面是为单选控件加一个value属性的例子
方式一:这里有可以指定命名空间,不指定传Null也可以
public class MyRadioButton1 extends RadioButton{
private String value;
public static final String NAMESPACE = "http://wei.jiang.selfview";
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public MyRadioButton1(Context context) {
super(context);
}
public MyRadioButton1(Context context, AttributeSet attrs) {
super(context, attrs);
private String value;
public static final String NAMESPACE = "http://wei.jiang.selfview";
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public MyRadioButton1(Context context) {
super(context);
}
public MyRadioButton1(Context context, AttributeSet attrs) {
super(context, attrs);
//命名空间与xml中一致
int resourceId = attrs.getAttributeResourceValue(NAMESPACE, "value", 0);
System.out.println(resourceId);
if (resourceId > 0) {
value = context.getResources().getText(resourceId).toString();
}
System.out.println(value);
}
}
int resourceId = attrs.getAttributeResourceValue(NAMESPACE, "value", 0);
System.out.println(resourceId);
if (resourceId > 0) {
value = context.getResources().getText(resourceId).toString();
}
System.out.println(value);
}
}
布局文件 :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:jw="http://wei.jiang.selfview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
</LinearLayout>
xmlns:jw="http://wei.jiang.selfview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<wei.jiang.selfview.view.MyRadioButton1
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的radioButton1"
jw:value="@string/myRadiontButton1" />
</LinearLayout>
方式二: 先看attrs文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MRadioButton2">
<attr name="value" format="string" />
</declare-styleable>
</resources>
这里可以通过typeArray.getString()方法直接获取值,可以先获取resoureId,再取值。
public class MyRadioButton2 extends RadioButton {
private String value;
public MyRadioButton2(Context context) {
super(context);
}
public MyRadioButton2(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyRadioButton2(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MRadioButton2);
this.value = a.getString(R.styleable.MRadioButton2_value);
int resourceId = a.getResourceId(R.styleable.MRadioButton2_value, 0);
//回收TypedArray,以便后面重用。在调用这个函数后,你就不能再使用这个TypedArray。
if (resourceId > 0) {
value = context.getResources().getText(resourceId).toString();
}
//value = a.getString(R.styleable.MRadioButton2_value);
System.out.println(value);
a.recycle();
}
public String getValue() {
return this.value;
}
}
布局文件 :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:jw="http://schemas.android.com/apk/res/wei.jiang.selfview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<wei.jiang.selfview.view.MyRadioButton2
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的radioButton2"
jw:value="@string/myRadiontButton2" />
</LinearLayout>
xmlns:jw="http://schemas.android.com/apk/res/wei.jiang.selfview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<wei.jiang.selfview.view.MyRadioButton2
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的radioButton2"
jw:value="@string/myRadiontButton2" />
</LinearLayout>
要注意的是: 一:两种写法中namespace的写法,方式一可以随意指定,方式二则必须以http://schemas.android.com/apk/res/开头
二: 布局文件赋值通过资源文件(@string/xx, @drawable/xx), 则控件类中须先取出resourceId,再取值;如果直接给的字符串,则可通过attrs.getAttributeValue()方法与TypeArray.getString()方法直接取值。