步骤1:建立自定义控件类,如继承View的类,并复写
public MyView(Context context, AttributeSet attrs){}构造方法
步骤2:在values目录下建立attrs.xml文件,内容格式如下:
步骤3:在布局中建立自定义控件,控件名称为该自定义视图类的类名(包括包名)
步骤4:在布局文件开始部分声明命名空间,格式见下方实例
步骤5:步骤1中的构造方法中通过
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyToggleBtn);
获得自定义的属性,再根据迭代后
for (int i = 0; i < ta.getIndexCount(); i++) {}
获取相对应的自定义属性的值。
以下是一个实例
//step1 attrs.xml文件内容
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- 声名属性集的名称 --> <declare-styleable name="MyToggleBtn"> <!-- 声名一个属性 name是my_background 类型为 引用类型 引用资源ID --> <attr name="my_background" format="reference" /> <!-- 声名一个属性 name是my_slide_btn 类型为 引用类型 引用资源ID --> <attr name="my_slide_btn" format="reference" /> <!-- 声名一个属性 name是curr_state 类型为 boolean 类型--> <attr name="curr_state" format="boolean" /> </declare-styleable> </resources>
//step2 布局文件中建立控件并定义自定义属性
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:gymyung="http://schemas.android.com/apk/res/com.g36bk.viewtest" android:layout_width="match_parent" android:layout_height="match_parent" > <com.g36bk.viewtest.View.ToggleView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" gymyung:curr_state="true" gymyung:my_background="@drawable/switch_background" gymyung:my_slide_btn="@drawable/slide_button" /> </RelativeLayout>
/**
参数解释:
声明命名空间:xmlns:gymyung="http://schemas.android.com/apk/res/com.g36bk.viewtest"
格式:xmlns(xml name space):gymyung(前缀)="http://schemas.android.com/apk/res/(固定写法)com.g36bk.viewtest(程序包名)"
定义自定义控件:<com.g36bk.viewtest.View.ToggleView />
定义自定义属性:gymyung:curr_state="true"
gymyung:my_background="@drawable/switch_background"
gymyung:my_slide_btn="@drawable/slide_button"
*/
//step3 控件应用类中找到属性的值
/** 参数解释: 声明命名空间:xmlns:gymyung="http://schemas.android.com/apk/res/com.g36bk.viewtest" 格式:xmlns(xml name space):gymyung(前缀)="http://schemas.android.com/apk/res/(固定写法)com.g36bk.viewtest(程序包名)" 定义自定义控件:<com.g36bk.viewtest.View.ToggleView /> 定义自定义属性:gymyung:curr_state="true" gymyung:my_background="@drawable/switch_background" gymyung:my_slide_btn="@drawable/slide_button" */ //step3 控件应用类中找到属性的值
/*********************************
附:在控件中若声明没有命名空间的属性时,系统并不会出现报错信息
但在视图中通过同样的方式可获取该属性的值
但对于字符串或布尔类型类似的属性可正常获取,
而类似引入连接比如图片资源的引用,获取到的值是所配置的字符串信息,
系统并没有进行相应的转换
**********************************/