編輯:關於Android編程
Android自定義View的構造函數
自定義View是Android中一個常見的需求,每個自定義的View都需要實現三個基本的構造函數,而這三個構造函數又有兩種常見的寫法。
第一種
每個構造函數分別調用基類的構造函數,再調用一個公共的初始化方法做額外初始化。
public class MyView extends ListView {
public MyView(Context context) {
super(context);
sharedConstructor();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
sharedConstructor();
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
sharedConstructor();
}
private void sharedConstructor() {
// Do some initialize work.
}
}
第二種
級聯式調用,每一個構造函數調用比它多一個參數的構造函數,最後一個構造函數調用基類的構造函數,最後在做一些額外的初始化工作。
public class MyView extends ListView {
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// Other initialize work.
}
}
那麼問題來了,我們該使用哪一種方式呢?
結論是:最好使用第一種,因為第二種方法在某些情況下會有問題,比如你自定義的View繼承自ListView或者TextView的時候,ListView或者TextView內部的構造函數會有一個默認的defStyle, 第二種方法調用時defStyle會傳入0,這將覆蓋基類中默認的defStyle,進而導致一系列問題。以ListView為例,看看它的構造函數。
public ListView(Context context) {
this(context, null);
}
public ListView(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.listViewStyle);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
// Other works.
}
可以看到ListView的第二個構造函數代碼中傳入了一個com.android.internal.R.attr.listViewStyle,使用第二種方法(級聯式)調用時,我們傳入的是0,將會覆蓋這個默認值。但是第一種方法中調用了super(context, attrs); 進而調用了基類的 this(context, attrs, com.android.internal.R.attr.listViewStyle);就不會產生問題。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
在Activity,Service,Window中監聽Home鍵和返回鍵的一些思考,如何把事件傳遞出來的做法!
在Activity,Service,Window中監聽Home鍵和返回鍵的一些思考,如何把事件傳遞出來的做法! 其實像按鍵的監聽,我相信很多人都很熟練了,我肯定也不會說這
Android自定義View實現左右滑動選擇出生年份
自定義view的第三篇,模仿的是微博運動界面的個人出生日期設置view,先看看我的效果圖: 支持設置初始年份,左右滑動選擇出生年份,對應的TextView的值也會改變。這
有向圖的十字鏈表表示
本文主要討論有向圖的十字鏈表表示,包括建圖,添加弧,刪除弧,以鄰接表的格式打印圖(其中包括兩種形式:1,同尾的弧構成條鏈 2,同頭的弧構成條鏈)c ++ 描述。類 Arc
qq厘米秀怎麼邀請?qq厘米秀使用常見問題及解決方法匯總
手機qq厘米秀是手機qq最新版本全新推出的一個全新的功能,您可以下載qq厘米秀內測版獲得更多qq獨特的表情和個人形象,手機qq厘米秀是PC版QQ秀在移動端的