Android 自定义组件 - 自定义属性 - 基础

attrs.xml

自定义属性,是在 res/values/attrs.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    //定义<declare-styleable />
</resources>

declare-styleable

定义:

<declare-styleable name="名称">
    <attr name="属性名" format="属性类型">
    </attr>
</declare-styleable>

属性类型

enum
integer
dimension
reference
string
boolean
color
flags
float
fraction

前提

CellText2.java:

public class CellText2 extends RelativeLayout {

    private static final String TAG = CellText2.class.getSimpleName();

    public CellText2(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater.from(context).inflate(R.layout.abc_cell_text2, this);

        TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.CellText2);
        
        /**
            获取属性值
        */

        int orientationValue = ta.getInt(R.styleable.CellText2_orientation,0);
        Log.e(TAG, "orientationValue = " + orientationValue);

        ta.recycle();
    }
}

在某个 XML 文件内加载:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mzc="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#fff">

    /**
        加载自定义组件、定制属性。
    */

</LinearLayout>

enum

<attr name="orientation" format="enum">
    <enum name="vertical" value="0"/>
    <enum name="horizontal" value="1"/>
</attr>

加载到 XML 文件:

<com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:orientation="vertical"
        />

CellText2.java 中处理:

int orientationValue = ta.getInt(R.styleable.CellText2_orientation, 0);
Log.e(TAG, "orientationValue = " + orientationValue);

integer

<attr name="test_integer" format="integer" />

加载到 XML 文件:

<com.example.muzico.boxuegu.abc.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:test_integer="3"
        />

CellText2.java 中处理:

int integerValue = ta.getInteger(R.styleable.CellText2_test_integer,0);
Log.e(TAG, "integerValue = " + integerValue);

dimension

<attr name="test_dimension" format="dimension" />

加载到 XML 文件:

<com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:test_dimension="100dp"
        />

CellText2.java 中处理:

float dimensionValue = ta.getDimension(R.styleable.CellText2_test_dimension,0);
Log.e(TAG, "dimensionValue = " + dimensionValue);

得到的结果是 150。
为啥呢。。。里面涉及很复杂的逻辑,反正这里是不会讲解的。
那么上面得到的150,到底是什么数值呢?

更改一下属性值:

mzc:test_dimension="100px"

最后得到的就是 100。
结果很明显,得到的数值就是 px 值。

reference

<attr name="test_reference" format="reference" />

加载到 XML 文件:

<com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:test_reference="@mipmap/launch_bg"
        />

CellText2.java 中处理:

int referenceValue = ta.getResourceId(R.styleable.CellText2_test_reference, 0);

imageViewRight.setImageResource(referenceValue);
或
imageViewRight.setBackgroundResource(referenceValue);

string

<attr name="test_string" format="string" />

加载到 XML 文件:

<com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:test_string="hello world"
        />

CellText2.java 中处理:

String stringValue = ta.getString(R.styleable.CellText2_test_string);
Log.e(TAG, "stringValue = " + stringValue);

boolean

<attr name="test_boolean" format="boolean" />

加载到 XML 文件:

<com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#33333333"
        mzc:test_boolean="true"
        />

CellText2.java 中处理:

boolean booleanValue = ta.getBoolean(R.styleable.CellText2_test_boolean,false);
Log.e(TAG, "booleanValue = " + booleanValue);

color