Android自定義屬性

自定義屬性

  1. 在res/values目錄下增長屬性定義文件attr.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyAttrs">
        <attr name="attrName" format="string" />
    </declare-styleable>
</resources>

經過<declare-styleable>標籤聲明瞭自定義屬性,經過name屬性來肯定引用的名稱。<attr>標籤訂義哪些屬性:name屬性名稱,format屬性類型,有:string , integer , dimension , reference , color, enum。須要注意的地方是,有些屬性能夠指定多個類型,好比有些能夠是顏色屬性,也能夠是引用屬性,這種狀況能夠使用「|」來分隔不一樣的屬性:"color|reference"。android


  1. 在自定義控件中使用定義的屬性
public class MyTextView extends TextView {

    private static String TAG = "MyTextView";

    public MyTextView(Context context) {
        super(context);
    }

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

        //將attrs.xml定義的declare-sytleable的全部屬性的值存儲在TypedArray中
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyAttrs);
        //從TypedArray中取出對應的值
        String customAttrValue = ta.getString(R.styleable.MyAttrs_customeAttrName);
        //獲取完TypedArray的值後,必定要調用recycle方法回收資源
        ta.recycle();
        Log.d(TAG, "customAttrValue is " + customAttrValue);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

經過context.obtainStyleAttributes()方法獲取在XML佈局文件中定義的那些屬性。接下來,就能夠經過TyepedArray的getXXX()方法獲取那些定義的屬性值。這裏須要注意的是,當獲取完全部屬性值後,不要忘了調用recyle()方法來完成資源的回收app


  1. 在佈局文件中使用自定義屬性
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.wh.myapplication.MainActivity">

    <com.example.wh.myapplication.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        custom:customeAttrName="Hello, Custom Attribute!"/>
</RelativeLayout>

xmlns:custom="http://schemas.android.com/apk/res-auto"指定引用的名字空間,這裏將引用的第三方控件的名字空間取名爲custom,以後在XML文件中使用自定義的屬性時,就能夠經過這個名字空間來引用:custom:customeAttrName="Hello, Custom Attribute!"。佈局

相關文章
相關標籤/搜索