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);就不会产生问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 自定义View
# 构造函数对比
# 自定义View构造函数详解
# Android studio 运行main 函数的方法
# 详解Android应用main函数的调用
# Android Studio生成函数注释的实现方法
# Android自定义View的三个构造函数
# Android编程计算函数时间戳的相关方法总结
# Android自定义view 你所需要知道的基本函数总结
# Android编程之匿名内部类与回调函数用法分析
# Android自定义View构造函数详解
# Android Chronometer控件实现计时器函数详解
# Android nativePollOnce函数解析
# 自定义
# 种方法
# 会有
# 第一种
# 的是
# 级联
# 来了
# 将会
# 两种
# 又有
# 希望能
# 第二个
# 可以看到
# 为例
# 而这
# 谢谢大家
# 这将
# 哪一种
# 第二种
# 如你
相关文章:
建站之星CMS五站合一模板配置与SEO优化指南
如何在建站之星绑定自定义域名?
c# 在高并发场景下,委托和接口调用的性能对比
网站制作需要会哪些技术,建立一个网站要花费多少?
潮流网站制作头像软件下载,适合母子的网名有哪些?
大同网页,大同瑞慈医院官网?
如何实现建站之星域名转发设置?
深圳网站制作案例,网页的相关名词有哪些?
制作电商网页,电商供应链怎么做?
Android使用GridView实现日历的简单功能
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
制作网站的公司有哪些,做一个公司网站要多少钱?
如何用虚拟主机快速搭建网站?详细步骤解析
建站ABC备案流程中有哪些关键注意事项?
动图在线制作网站有哪些,滑动动图图集怎么做?
如何选择最佳自助建站系统?快速指南解析优劣
如何通过网站建站时间优化SEO与用户体验?
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何生成腾讯云建站专用兑换码?
微信推文制作网站有哪些,怎么做微信推文,急?
成都网站制作报价公司,成都工业用气开户费用?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
h5网站制作工具有哪些,h5页面制作工具有哪些?
宝塔面板如何快速创建新站点?
如何通过可视化优化提升建站效果?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
高性价比服务器租赁——企业级配置与24小时运维服务
如何通过.red域名打造高辨识度品牌网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何快速搭建虚拟主机网站?新手必看指南
利用JavaScript实现拖拽改变元素大小
建站主机解析:虚拟主机配置与服务器选择指南
孙琪峥织梦建站教程如何优化数据库安全?
建站之星免费版是否永久可用?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
,网站推广常用方法?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
制作公司内部网站有哪些,内网如何建网站?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
活动邀请函制作网站有哪些,活动邀请函文案?
如何在VPS电脑上快速搭建网站?
常州企业建站如何选择最佳模板?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
深圳网站制作的公司有哪些,dido官方网站?
如何安全更换建站之星模板并保留数据?
,巨量百应是干嘛的?
网站制作的步骤包括,正确网址格式怎么写?
*请认真填写需求信息,我们会在24小时内与您取得联系。