<?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
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
<?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!"。佈局