1.在value檔案夾下建立一個demo_att.xml
內容如下:
[html]
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="age" format="integer" />
<attr name="city" format="string" />
<attr name="university" format="string" />
</declare-styleable>
</resources>
format代表資料格式,有很多
可能對format不是很熟悉,目前Android系統內建的格式類型有integer比如ProgressBar的進度值,
float比如RatingBar的值可能是3.5顆星,
boolean比如ToggleButton的是否勾選,
string比如TextView的text屬性,
當然除了我們常見的基礎類型外,Android的屬性還有特殊的比如color是用於顏色屬性的,可以識別為#FF0000等類型,
當然還有dimension的尺寸類型,比如23dip,15px,18sp的長度單位,
還有一種特殊的為reference,一般用於引用@+id/test ,@drawable/xxx這樣的類型。
當然什麼時候用reference呢? 我們就以定義一個顏色為例子,
<attr name="red" format="color|reference" />
這裡我們用了邏輯或的運算子,定義的紅色是顏色類型的,同時可以被引用
2.在自訂的MyView裡引用自訂的屬性
[html]
package com.android.demo.att;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
private int mAge;
private String mCity;
private String mUniversity;
private int age2;
private int resId;
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
//方式1擷取屬性
TypedArray a = context
.obtainStyledAttributes(attrs, R.styleable.MyView);
mAge = a.getInteger(R.styleable.MyView_age, 25);
mCity = a.getString(R.styleable.MyView_city);
mUniversity = a.getString(R.styleable.MyView_university);
a.recycle(); // 提示大家不要忘了回收資源
}
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(30);
canvas.drawText(mCity, 50, 50, paint);
canvas.drawLine(0, 50, 500, 50, paint);
super.onDraw(canvas);
}
}
[html]
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
[html]
這句話用於獲得定義的屬性集。都封裝到這個對象裡面了。
以上兩步把自訂的view和屬性都定義完了。
3.在布局檔案中使用自訂的屬性和view
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:demo="http://schemas.android.com/apk/res/com.android.demo.att"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<com.android.demo.att.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
demo:age="22"
demo:city="shanghai"
demo:university="sddx" />
</LinearLayout>
[html]
xmlns:demo="http://schemas.android.com/apk/res/com.android.demo.att"
這個是用來定義命名空間用的,demo代表的命名空間,
[html]
com.android.demo.att表示該命名空間用於哪個包
[html]
[html]
和android預設的包同樣的用法
[html]
[html]
通過以上代碼可以運行了。
[html]
[html]
摘自 com360的專欄