Android 自定义组件 - 自定义属性 - 简单

自定义属性,是通过下面的文件 attr.xml 来定义的。
如果 attr.xml 不存在就创建吧。

res/values/attr.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CellText2">
        <attr name="text_left" format="string" />
        <attr name="text_right" format="string" />
    </declare-styleable>
</resources>

cell_text2.xml:

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">

        <TextView
            android:id="@+id/textview_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:textColor="#000"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/textview_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:textColor="#a3a3a3"
            android:textSize="14sp"/>

    </RelativeLayout>

</LinearLayout>

CellText2.java:

package com.example.muzico.test;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class CellText2 extends RelativeLayout {
    public TextView textLeft;
    public TextView textRight;


    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);


        textLeft = findViewById(R.id.textview_left);
        textRight = findViewById(R.id.textview_right);

        TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.CellText2);
        String text_left = ta.getString(R.styleable.CellText2_text_left);
        String text_right = ta.getString(R.styleable.CellText2_text_right);


        Log.e(TAG, "text_left = " + text_left + " , text_right = " + text_right);

        textLeft.setText(text_left);
        textRight.setText(text_right);

        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">

    <com.example.muzico.test.CellText2
        android:layout_width="match_parent"
        android:layout_height="60dp"
        mzc:text_left="1111111"
        mzc:text_right="22222222"
        android:background="#33333333"
        />

</LinearLayout>

通过这句语句,将自定义属性引入使用:

xmlns:mzc="http://schemas.android.com/apk/res-auto"

再由 mzc调用自定义属性:

        mzc:text_left="1111111"
        mzc:text_right="22222222"

效果:

F79F72F6-5234-4DCC-B180-A540F8EF696A