• 用Kotlin实现Android定制视图(KAD 06)


    作者: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,但不说明任何构造函数:

    1 class KotlinView : View {
    2 }

    由于这段代码邀请调用父类的构造函数,所以这段地面不能编译。

     

     

    例如,如果你仅仅是在Kotlin代码中扩展你的视图,你可能用我们已经见到的唯一的构造函数形式:

    1 class KotlinView(context: Context?) : View(context) {
    2 }

    但是要小心,由于如果决定在这个视图加XML,它将失败。

     

     

    说明:你见到在Context右边的问号吗?在Kotlin中,如果我们要变量或参数是null,我们就必须用问号明确地指明它。之后编译器将要求我们在使用该变量前检查它不能为null。在下一篇文章阅读这点。

     

    实现多构造函数

     

    构造函数用保留字constructor,它可以是同类的另一个构造函数(用this)或一个父类(用super)。

     

     

    这是你定义Android视图的构造函数:

     1 class KotlinView : View {
     2  
     3     constructor(context: Context?) : this(context, null)
     4     constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)
     5  
     6     constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
     7         ...
     8     }
     9  
    10 }

     

    更简单实现方法

     

    在评论中,Kirill提及(非常感谢!)另一种方法更简单、更易阅读。它是基于为构造函数的自变量分配默认值,但是需要一点点调整。

     

     

    问题是在你用自变量默认值创建构造函数(或任何函数)时,在Kotlinzhong产生的字节码仅仅允许用那些默认值。如果在Java中,你用构造函数,你可以强制说明所有自变量的值。

     

     

    这是因为Java没有这样的语言特性。在Java中,你要依据你的需要通过产生函数重载解决它。

     

     

    Kotlin中,你可以用@JvmOverloads注释得到自动产生的代码。

     

     

    代码像这样:

    1 class KotlinView @JvmOverloads constructor(
    2         context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    3 ) : View(context, attrs, defStyleAttr)

     

    结论

    一旦你了解它,产生包含有多个构造函数的定制的视图也不复杂了,用@JvmOverloads注释则更容易。

     

     

    这对于任何需要多个构造函数的类是都非常有用。但总的来说,如你能赋值参数的默认值(从而避免重载),通常就不需要多个构造函数。

     

     

    如果你要了解更多这方面知识编写实际的APP,我建议你阅读我书《Android开发者的Kotlin》。

     

    Kotlin中创建定制视图

  • 相关阅读:
    小程序踩坑(三)-上拉加载和下拉刷新篇
    小程序踩坑(二)
    小程序入门(一)
    移动端那些事(一)
    css3写单选框,复选框
    websockect入门(一)
    一个简单的blog系统(十六) 增加日志功能
    一个简单的blog系统(十四) 增加用户头像
    一个简单的blog系统(十三) 增加404页面
    一个简单的blog系统(十二) 增加友情链接页面
  • 原文地址:https://www.cnblogs.com/figozhg/p/6250185.html
Copyright © 2020-2023  润新知