用Kotlin实现Android定制视图(KAD 06)
时间:Dec 27, 2016
原文链接:https://antonioleiva.com/custom-views-android-kotlin/

在我们阅读有关class文章时,你可能记得通常情况下仅用一个构造函数。这对于要创建定制视图就是一个问题。
Android框架希望有多个构造函数对应不同的创建视图位置和创建视图方法(通过代码、使用XML,设置主题,等等),这样我们就不能忽略这种情况。
为此,Kotlin团队提供了同一个类中有多个构造函数的能力,就如同这里所说的。
兼容Java是Kotlin的基础要求,所以无论你遇到什么情况,就应该想到必定有方法实现你的需要。
在Kotlin中创建定制视图
即使你已经有创建定制视图的经验和一些Kotlin知识,也可能第一次在Kotlin中创建定制视图,你会发现有点复杂。
在Kotlin中实现几个构造函数是最为复杂的工作之一,准确地说,这是比较罕见用法。
但是,不用担心,一旦你接触过一次,其余的都是非常相似的。
注:尽管本文能有效的帮助你理解如何使用在Kotlin类中用多个构造函数,但是,Kirill
Rakhman在评论提及的方法是更好的方法。在结尾阅读。
创建继承View的类
为了这样,就如我们早前见到的那样创建一个类。例如它继承View,但不说明任何构造函数:
class KotlinView : View {
}
由于这段代码邀请调用父类的构造函数,所以这段地面不能编译。
例如,如果你仅仅是在Kotlin代码中扩展你的视图,你可能用我们已经见到的唯一的构造函数形式:
class KotlinView(context: Context?) : View(context) {
}
但是要小心,由于如果决定在这个视图加XML,它将失败。
说明:你见到在Context右边的问号吗?在Kotlin中,如果我们要变量或参数是null,我们就必须用问号明确地指明它。之后编译器将要求我们在使用该变量前检查它不能为null。在下一篇文章阅读这点。
实现多构造函数
构造函数用保留字constructor,它可以是同类的另一个构造函数(用this)或一个父类(用super)。
这是你定义Android视图的构造函数:
class KotlinView : View {
constructor(context: Context?) : this(context, null)
constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
...
}
}
更简单实现方法
在评论中,Kirill提及(非常感谢!)另一种方法更简单、更易阅读。它是基于为构造函数的自变量分配默认值,但是需要一点点调整。
问题是在你用自变量默认值创建构造函数(或任何函数)时,在Kotlinzhong产生的字节码仅仅允许用那些默认值。如果在Java中,你用构造函数,你可以强制说明所有自变量的值。
这是因为Java没有这样的语言特性。在Java中,你要依据你的需要通过产生函数重载解决它。
在Kotlin中,你可以用@JvmOverloads注释得到自动产生的代码。
代码像这样:
class KotlinView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)
结论
一旦你了解它,产生包含有多个构造函数的定制的视图也不复杂了,用@JvmOverloads注释则更容易。
这对于任何需要多个构造函数的类是都非常有用。但总的来说,如你能赋值参数的默认值(从而避免重载),通常就不需要多个构造函数。
如果你要了解更多这方面知识编写实际的APP,我建议你阅读我书《Android开发者的Kotlin》。
在Kotlin中创建定制视图
用Kotlin实现Android定制视图(KAD 06)的更多相关文章
- 用Kotlin开发Android应用(IV):定制视图和Android扩展
原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...
- Kotlin与Android SDK 集成(KAD 05)
作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...
- Kotlin的android扩展:对findViewById说再见(KAD 04)
作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使 ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Android自定义视图四:定制onMeasure强制显示为方形
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- 使用Kotlin开发Android应用(IV):自定义视图和Android扩展
在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotl ...
- 即刻开始使用Kotlin开发Android的12个原因(KAD 30)
作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...
- Android自定义视图二:如何绘制内容
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- 使用Kotlin对ViewGroup的视图进行函数使操作
原文标题:Functional operations over Views in ViewGroup using Kotlin 原文链接:http://antonioleiva.com/functio ...
随机推荐
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- Angular2开发笔记
Problem 使用依赖注入应该注意些什么 服务一般用来做什么 指令一般用来做什么 angular2如何提取公共组件 angular2为什么不需要提公共组件 父组件与子组件之间如何通讯 什么时候应该使 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 设计模式C#合集--抽象工厂模式
抽象工厂,名字就告诉你是抽象的了.上代码. public interface BMW { public void Drive(); } public class BMW730 : BMW { publ ...
- arcgis api for js入门开发系列七图层控制(含源代码)
上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...
- iOS从零开始学习直播之2.采集
直播的采集由采集的设备(摄像头.话筒)不同分为视频采集和音频采集,本篇文章会分别介绍. 1.采集步骤 1.创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕 ...
- github免输用户名/密码SSH登录的配置
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...