自定义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);就不会产生问题。

整理自StackOverflow上的问题,原文链接。

==

转载于:https://www.cnblogs.com/graphics/p/5814762.html

Android自定义View的构造函数相关推荐

  1. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  2. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

  3. android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性

    android 自定义view属性 一个完美的自定义控件也可以添加xml来配置属性和风格.要实现这一点,可按照下列步骤来做: 1) 添加自定义属性到xml文件中 2) 在xml的中,指定属性的值 3) ...

  4. Android自定义view详解,使用实例,自定义属性,贝塞尔曲线

    //只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //vi ...

  5. Android自定义View 开发流程综合简述 Android自定义View(三)

    本文简述一下自定义View中常用方法 1 简述 自定义View可以认为是继承自View或者ViewGroup Android中的任何一个布局.任何一个控件其实都是直接或间接继承自View的,如Text ...

  6. Android 系统(201)---Android 自定义View实战系列 :时间轴

    Android 自定义View实战系列 :时间轴 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常 ...

  7. android 自定义 对号,Android自定义View实现打钩动画功能

    先上效果图 动图 静态图 1. 回顾 [Android自定义View:一个精致的打钩小动画]上一篇文章,我们已经实现了基本上实现了控件的效果了,但是...但是...过了三四天后,仔细看回自己写的代码, ...

  8. android自定义View学习(一)----创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...

  9. Android自定义view之ViewPager指示器——2

    Android自定义view之ViewPager指示器--2 上一篇<Android自定义view之ViewPager指示器--1>中我们一起写了测量和布局的流程.本篇我们继续讲解事件分发 ...

  10. Android自定义view之ViewPager指示器——1

    Android自定义view之ViewPager指示器--1 在上两篇文章<Android自定义view之measure.layout.draw三大流程>以及<Android自定义v ...

最新文章

  1. 微信公众平台开发(24) 自定义菜单功能开发
  2. 精通Android自定义View(十五)invalidate方法和postInvalidate方法
  3. inputtextarea表单提示文字
  4. 我想创业,但不懂技术怎么办
  5. puttygen 可以将key文件转为pem文件for xshell 20211213
  6. 关闭远程服务器端口,远程端口 程序自动关闭问题解决方案
  7. python注册大漠插件,大漠插件安装包
  8. 全国大学生数学竞赛学习笔记
  9. The full stack trace of the root cause is available in the server logs.
  10. pythonturtle画图库使用技巧_Python画图库turtle使用方法简介
  11. 批处理——提取SRT文字中的文字
  12. Nette框架未授权任意代码执行漏洞分析
  13. 等边三角形的积木编程
  14. 基于谷歌GKE使用Kubernetes
  15. 古人的地图是怎么来的?没高科技情况下,是靠什么方法测绘的呢?
  16. Modbus CRC16校验方法及实现代码
  17. “赌徒”金立|一点财经
  18. 想调整视频的色彩平衡就这样操作
  19. Gly-Phe-Leu, 15373-56-5
  20. 用HTML+CSS做一个漂亮简单的音乐网站

热门文章

  1. 开源html5游戏-少年行
  2. Python使用总结
  3. SQL Server 2012 扩展事件(2)体系结构
  4. HSRP冗余热备份协议
  5. [实验手册]用2500路由器做自动安装实验
  6. Android 原生开发、H5、React-Native Flutter 使用利弊和场景技术分享
  7. 这款IDEA插件刷爆了技术群,群友:这用起来真酸爽~
  8. 横空出世,比Visio快10倍的画图工具来了
  9. 千万级用户-亿级请求的平台架构演变
  10. 实施微服务架构的关键技术