1. 程式人生 > >android View的三個構造方法 簡單總結

android View的三個構造方法 簡單總結


在android開發中,我們經常會涉及到自定義View,View有3個構造方法(可能以後會更多),如下:

public CircleView(Context context) {
	this(context,null);
}

public CircleView(Context context, AttributeSet attrs) {
	this(context,attrs,R.attr.customViewStyle);
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
	super(context, attrs, defStyleAttr);
	//初始化屬性
        TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.customView,defStyleAttr,0);
        circleWidth=array.getDimensionPixelSize(R.styleable.circleView_circleWidth,DEFALUT_CIRCLE_WIDTH);
	array.recycle();
	init();
}


第一個構造方法是提供給我們在程式碼中生成控制元件使用的,第二個方法是在XML佈局檔案中插入控制元件使用的,其中attrs引數就是我們在XML中定義控制元件的屬性(包含自定義的屬性),其實第二個建構函式也是呼叫第三個建構函式,這裡我在第三個引數傳入R.attr.customViewStyle,第三個方法的第三個引數defStyleAttr的意義是從APP或者Activity的Theme中設定的該控制元件的屬性的預設值,如下:

這是我再attrs檔案中定義的屬性,也就是上面構造方法中傳入的引數

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

然後我們需要在App 或者Activity的Theme中設定它的值

 <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="customViewStyle">@style/custom_view_style</item>
 </style>

其中的custom_view_style

<style name="custom_view_style">
       <item name="circleWidth">8dp</item>
</style>
這樣當你的XML檔案中沒有給該控制元件的circleWidth定義值的時候,預設值就是8dp。

注意:

TypedArray array=context.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes);

該方法的第四個引數defStyleRes,可以直接傳入自定義的style,如果defStyleAttr為0,defStyleRes才會起作用。

android控制元件獲取屬性值的優先順序:

1.在XMl檔案中直接定義;

2.在XMl檔案引用的style;

3.就是從如上所說的defStyleAttr中取值;

4.從defStyleRes取值;

5.從Activity或者Application的Theme中取值;