作者:Antonio Leiva

时间: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)的更多相关文章

  1. 用Kotlin开发Android应用(IV):定制视图和Android扩展

    原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...

  2. Kotlin与Android SDK 集成(KAD 05)

    作者:Antonio Leiva 时间:Dec 19, 2016 原文链接:https://antonioleiva.com/kotlin-integrations-android-sdk/ 使用Ko ...

  3. Kotlin的android扩展:对findViewById说再见(KAD 04)

    作者:Antonio Leiva 时间:Dec 12, 2016 原文链接:http://antonioleiva.com/kotlin-android-extensions/ 你也许已厌倦日复一日使 ...

  4. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  5. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  6. 使用Kotlin开发Android应用(IV):自定义视图和Android扩展

    在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotl ...

  7. 即刻开始使用Kotlin开发Android的12个原因(KAD 30)

    作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们 ...

  8. Android自定义视图二:如何绘制内容

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  9. 使用Kotlin对ViewGroup的视图进行函数使操作

    原文标题:Functional operations over Views in ViewGroup using Kotlin 原文链接:http://antonioleiva.com/functio ...

随机推荐

  1. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  2. React 入门教程

    React 起源于Facebook内部项目,是一个用来构建用户界面的 javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组件内 ...

  3. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  4. 0-1背包问题蛮力法求解(c++版本)

    // 0.1背包求解.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream>   #define ...

  5. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  6. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  7. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  8. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  9. WebGIS中等值面展示的相关方案简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值面是气象.环保等相关项目上常用到的效果展示.在传统的CS项 ...

  10. Java实现Excel中的NORMSDIST函数和NORMSINV函数

    由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...