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);就不会产生问题。
整理自StackOverflow上的问题,原文链接。
==
转载于:https://www.cnblogs.com/graphics/p/5814762.html
Android自定义View的构造函数相关推荐
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...
- android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性
android 自定义view属性 一个完美的自定义控件也可以添加xml来配置属性和风格.要实现这一点,可按照下列步骤来做: 1) 添加自定义属性到xml文件中 2) 在xml的中,指定属性的值 3) ...
- Android自定义view详解,使用实例,自定义属性,贝塞尔曲线
//只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //vi ...
- Android自定义View 开发流程综合简述 Android自定义View(三)
本文简述一下自定义View中常用方法 1 简述 自定义View可以认为是继承自View或者ViewGroup Android中的任何一个布局.任何一个控件其实都是直接或间接继承自View的,如Text ...
- Android 系统(201)---Android 自定义View实战系列 :时间轴
Android 自定义View实战系列 :时间轴 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常 ...
- android 自定义 对号,Android自定义View实现打钩动画功能
先上效果图 动图 静态图 1. 回顾 [Android自定义View:一个精致的打钩小动画]上一篇文章,我们已经实现了基本上实现了控件的效果了,但是...但是...过了三四天后,仔细看回自己写的代码, ...
- android自定义View学习(一)----创建一个视图类
创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...
- Android自定义view之ViewPager指示器——2
Android自定义view之ViewPager指示器--2 上一篇<Android自定义view之ViewPager指示器--1>中我们一起写了测量和布局的流程.本篇我们继续讲解事件分发 ...
- Android自定义view之ViewPager指示器——1
Android自定义view之ViewPager指示器--1 在上两篇文章<Android自定义view之measure.layout.draw三大流程>以及<Android自定义v ...
最新文章
- 微信公众平台开发(24) 自定义菜单功能开发
- 精通Android自定义View(十五)invalidate方法和postInvalidate方法
- inputtextarea表单提示文字
- 我想创业,但不懂技术怎么办
- puttygen 可以将key文件转为pem文件for xshell 20211213
- 关闭远程服务器端口,远程端口 程序自动关闭问题解决方案
- python注册大漠插件,大漠插件安装包
- 全国大学生数学竞赛学习笔记
- The full stack trace of the root cause is available in the server logs.
- pythonturtle画图库使用技巧_Python画图库turtle使用方法简介
- 批处理——提取SRT文字中的文字
- Nette框架未授权任意代码执行漏洞分析
- 等边三角形的积木编程
- 基于谷歌GKE使用Kubernetes
- 古人的地图是怎么来的?没高科技情况下,是靠什么方法测绘的呢?
- Modbus CRC16校验方法及实现代码
- “赌徒”金立|一点财经
- 想调整视频的色彩平衡就这样操作
- Gly-Phe-Leu, 15373-56-5
- 用HTML+CSS做一个漂亮简单的音乐网站