欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android自定义控件——自定义属性

程序员文章站 2022-06-08 23:42:02
...

自定义属性是什么?

自定义属性指用户定义的关于控件的属性,可在xml布局文件中直接应用并获取

实现

在res/values下新建attrs.xml,如下在一个declare-styleable标签下定义了2个arr标签

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="My_style">
        <attr name="attr1" format="boolean" />
        <attr name="attr2" format="enum">
            <enum name="one" value="1" />
            <enum name="two" value="2" />
        </attr>
    </declare-styleable>
</resources>

在自定义控件MyView中使用自定义属性my:attr1和my:attr2,使用前应该申明命名空间xmlns:my="http://schemas.android.com/apk/res-auto"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:my="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

    <com.example.app2.MyView
        android:layout_width="match_parent"
        my:attr1="false"
        my:attr2="one"
        android:layout_height="wrap_content"/>

</LinearLayout>

在自定义控件中获取属性的值,在构造方法中通过TypedArray获取

public class MyView extends LinearLayout {

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.My_style);
        boolean attr1 = ta.getBoolean(R.styleable.My_style_attr1, true);
        int attr2 = ta.getInteger(R.styleable.My_style_attr2, 0);
        ta.recycle();
        Log.d("test", "attr1=" + attr1);
        Log.d("test", "attr1=" + attr2);
    }
}