android attrs组件自定义属性

时间:2021-10-23 20:41:30
自定义控件 自定义属性
步骤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 控件应用类中找到属性的值

/*********************************
附:在控件中若声明没有命名空间的属性时,系统并不会出现报错信息
但在视图中通过同样的方式可获取该属性的值
但对于字符串或布尔类型类似的属性可正常获取,
而类似引入连接比如图片资源的引用,获取到的值是所配置的字符串信息,
系统并没有进行相应的转换
**********************************/