自定義view是android中乙個常見的需求,每個自定義的view都需要實現三個基本的建構函式,而這三個建構函式又有兩種常見的寫法。
每個建構函式分別呼叫基類的建構函式,再呼叫乙個公共的初始化方法做額外初始化。
publicclass myview extends
listview
public
myview(context context, attributeset attrs)
public myview(context context, attributeset attrs, int
defstyleattr)
private
void
sharedconstructor()
}
級聯式呼叫,每乙個構造函式呼叫比它多乙個引數的建構函式,最後乙個構造函式呼叫基類的建構函式,最後在做一些額外的初始化工作。
publicclass 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為例,看看它的建構函式。
publiclistview(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布局檔案中需要...