Android自定義View的建構函式

2021-09-08 01:27:20 字數 1491 閱讀 6628

自定義view是android中乙個常見的需求,每個自定義的view都需要實現三個基本的建構函式,而這三個建構函式又有兩種常見的寫法。

每個建構函式分別呼叫基類的建構函式,再呼叫乙個公共的初始化方法做額外初始化。

public

class myview extends

listview

public

myview(context context, attributeset attrs)

public myview(context context, attributeset attrs, int

defstyleattr)

private

void

sharedconstructor()

}

級聯式呼叫,每乙個構造函式呼叫比它多乙個引數的建構函式,最後乙個構造函式呼叫基類的建構函式,最後在做一些額外的初始化工作。

public

class myview extends

listview

public

myview(context context, attributeset attrs)

public myview(context context, attributeset attrs, int

defstyleattr)

}

那麼問題來了,我們該使用哪一種方式呢?

結論是:最好使用第一種,因為第二種方法在某些情況下會有問題,比如你自定義的view繼承自listview或者textview的時候,listview或者textview內部的建構函式會有乙個預設的defstyle, 第二種方法呼叫時defstyle會傳入0,這將覆蓋基類中預設的defstyle,進而導致一系列問題。以listview為例,看看它的建構函式。

public

listview(context context)

public

listview(context context, attributeset attrs)

public listview(context context, attributeset attrs, int

defstyleattr)

public listview(context context, attributeset attrs, int defstyleattr, int

defstyleres)

可以看到listview的第二個建構函式**中傳入了乙個com.android.internal.r.attr.listviewstyle,使用第二種方法(級聯式)呼叫時,我們傳入的是0,將會覆蓋這個預設值。但是第一種方法中呼叫了super(context, attrs); 進而呼叫了基類的this(context, attrs, com.android.internal.r.attr.listviewstyle);就不會產生問題。

Android自定義View 自定義元件

自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...

Android自定義View 一 View的測量

想要讓系統繪製出你所需要的圖形,就必須告訴系統view的大小,所以,在繪製view時,先實現view的onmesure 方法。在測量view之前,要先了解measurespec這個類,measurespec物件中包含了測量的模式和測量的大小 measurespec.exactly 精確模式 當我們將...

Android自定義View實現

android自定義view實現很簡單 繼承view或者其子類,重寫建構函式 ondraw,onmeasure 等函式,根據繼承的類的不同可能有所不同。如果自定義的view需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。在使用到自定義view的xml布局檔案中需要...