在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍。

自定义视图

你应该还记得,在说到Kotlin的局限性时,我们提到了在Kotlin早期版本(M10之前)是不支持自定义视图的,因为当时只能为每个类创建一个构造函数。这通常是足够的,因为使用可选参数,我们可以创建足够多的构造函数变种,例如:

class MyClass(param: Int, optParam1: String = "", optParam2: Int = 1)
{


 init {

 // Initialization code

 }

}

通过这一个构造函数,我们有如下四种方式创建这个类:

val myClass1 = MyClass(1)
val myClass2 = MyClass(1, "hello")
val myClass3 = MyClass(param = 1, optParam2 = 4)
val myClass4 = MyClass(1, "hello", 4)

正如你所见,使用可选参数我们得到了一堆的组合。但是通过继承普通Views的方式来创建自定义Views时,我们可能会遇到问题。自定义Views需要重写一个或者多个构造函数以便正常工作,但我们做不到这一点。幸运的是,自动Kotlin M11开始,我们可以声明多个构造函数,类似Java。下面是一个正方形的ImageView:

class SquareImageView : ImageView {

    public constructor(context: Context) : super(context) {
} public constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
} public constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
} override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width = getMeasuredWidth()
setMeasuredDimension(width, width)
}
}

通过很简单的代码我们实现了自定义Views。

Kotlin Android扩展

从Kotlin M11开始增加的扩展插件使得Android开发者更容易取得XML文件中定义的Views。你可能会觉得它很像ButterKnife,但使用起来更简单。

Kotlin Android扩展本质上是一个视图绑定,使得开发者在代码中通过id就可以使用XML文件中定义的Views。它将自动为Views创建属性值,而不用使用第三方注解框架或者findViewById函数。

要使用这个特性,首先需要安装插件“Kotlin Android Extension”,并在build.gradle文件的构建脚本依赖中增加一个新的classpath:

buildscript {



 dependencies {
…

classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}

}

假如你定义了名为main.xml的布局文件:

<FrameLayout

xmlns:android="..."

 android:id="@+id/frameLayout"

 android:orientation="vertical"

 android:layout_width="match_parent"

 android:layout_height="match_parent"> 

 <TextView

 android:id="@+id/welcomeText"

android:layout_width="wrap_content"

 android:layout_height="wrap_content"/>

 </FrameLayout>

如果想在Activity中使用这个文件里面定义的Views,你只需要导入这个xml文件的synthetic属性值,如下所示:

import kotlinx.android.synthetic.<xml_name>.*

具体到我们的例子,则如下所示:

import kotlinx.android.synthetic.main.*

这样你就可以使用id来取得这些views的引用了:

override fun onCreate(savedInstanceState: Bundle?) {

super<BaseActivity>.onCreate(savedInstanceState)
setContentView(R.id.main)

frameLayout.setVisibility(View.VISIBLE)

 welcomeText.setText("I´m a welcome text!!")

}

总结

这两个新特性的引入,让我们看到了Kotlin团队致力于让Android开发更简单。他们也发布了一个名为Anko的函数库,这个一门从Kotlin文件创建Android布局的领域特定语言(DSL)。我还没有使用过它的主要功能,但当处理Android视图时,你可以使用它来简化代码。在我上传到Github上的开源项目Bandhook-Kotlin也有相关的例子。

下一篇文章将介绍lambda表达式的使用,以及它如何简化代码和扩展语言的特性。非常有趣的一个特性,在我看来,这是Kotlin相比Java 1.7最强大的方面。

使用Kotlin开发Android应用(IV):自定义视图和Android扩展的更多相关文章

  1. Android自定义视图一:扩展现有的视图,添加新的XML属性

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

  2. 创建自定义视图在Android矩阵效果画布教程

    介绍 下面是一个快速教程,教你如何在Android中创建自定义视图.自定义视图创建一个矩阵雨效果. 本教程发布在http://www.androidlearner.com/. 背景 下面是关于如何工作 ...

  3. Android中的自定义视图控件

    简介 当现有控件不能满足需求时,就需要自定义控件. 自定义控件属性 自定义控件首先要继承自View,重写两个构造函数. 第一个是代码中使用的: public MyRect(Context contex ...

  4. 自定义视图一:扩展现有的视图,添加新的XML属性

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! 简介 这个系列详细的介绍了如何穿件Android自定义视图.主要涉及的内容有如何绘制内容,layout和measure的原理,如何继承 ...

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

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

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

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

  7. Android自定义视图教程

    Android自定义视图教程 Android的UI元素都是基于View(屏幕中单个元素)和ViewGroup(元素的集合),Android有许多自带的组件和布局,比如Button.TextView.R ...

  8. Android自定义视图三:给自定义视图添加“流畅”的动画

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

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

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

随机推荐

  1. Python 解码 Unicode 转义字符串 (转)

    其实,这里要讨论的内容是针对 Python2 的,实际上也是 Python2 中让人头疼的编码问题,而 Python3 则好处理得多. 先来看看例子: >>> s = "我 ...

  2. web info

    http://blog.csdn.net/qq_24473141/article/details/51363662 http://blog.sina.com.cn/s/blog_8e392fc2010 ...

  3. [c#.Net]DevExpress使用记录

    Devexpress知识点 Grid controlDataSource使用BindingList<>,动态绑定数据源 Grid viewOptionBehaviour.Editable可 ...

  4. python加密包

    利用pycrypto包进行AES.DES.MD5等加密 原文: http://www.cnblogs.com/darkpig/p/5676076.html 第三方Crypto包提供了较全面的加密算法, ...

  5. java 无状态和有状态区别

     诸位Java程序员,想必大家对SimpleDateFormat并不陌生.不过,你是否知道,SimpleDateFormat不是线程安全的(thread safe).这意味着,下面的代码是错误的: ...

  6. iOS 后台定位审核被拒How to clarify the purpose of its use in the locatio

    4.5 - Apps using background location services must provide a reason that clarifies the purpose of th ...

  7. Windows Server 2008 R2入门之用户管理

    一.用户账户概述: ”用户”是计算机的使用者在计算机系统中的身份映射,不同的用户身份拥有不同的权限,每个用户包含一个名称和一个密码: 在Windows中,每个用户帐户有一个唯一的安全标识符(Secur ...

  8. SHELL $RANDOM产生的随机数范围是0到32767

    1.使用系统的 $RANDOM 变量 fdipzone@ubuntu:~$ echo $RANDOM 17617 fdipzone@ubuntu:~$ echo $RANDOM 17617 $RAND ...

  9. 用关键字interface定义接口,通过关键字implements来实现接口

    [定义]Java中,能够完成特定功能的,由若干属性和方法组织成的,相对独立的属性和方法的集合. [用途]实现类的多继承,以解决Java只能单继承,不支持多继承的问题. [特点] 用关键字interfa ...

  10. python 面试题 string int

    str1 = 'hello' str2 = str1 str3 = str1 str4 = str1 str1 = '' int1 = 1 int2 = int1 int3 = int1 int4 = ...