本章主要介绍Kotlin开发环境的搭建过程,首先阐述Kotlin语言与Android开发之间的关系,接着描述Kotlin开发工具,也就是Android Studio的安装和启动步骤,然后说明SDK及其相关插件的安装与升级方法,接着论述如何对Kotlin工程的编译配置进行调整,最后演示Kotlin新技术带来哪些革命性的变化。
1.1 Kotlin与Android开发的关系
本节主要介绍Kotlin语言与Android开发之间的关系,包括Kotlin的基本概念及其特殊优势,以及Kotlin被谷歌钦定为Android Studio官方开发语言之后的发展大事。
1.1.1 Kotlin语言简介
Kotlin是一种基于JVM的新型编程语言,它完全兼容Java语言,Kotlin代码可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。与流行的Java语言比较,Kotlin具备下列优势:
(1)Kotlin更简洁,完成同样的业务功能,Kotlin代码通常只有对应Java代码的三分之一。
(2)Kotlin更安全,它能够在编码阶段就自动检测常见的BUG,比如引用了空指针等。
(3)Kotlin更强大,它提供了扩展函数、默认参数、接口委托、属性代理等Java所不具备的高级特性,从而可以完成更复杂的业务逻辑。
1.1.2 Android Studio的官方开发语言
Kotlin很早就被运用到Android开发之中,之前一直作为Android Studio的插件提供下载,Android Studio只要安装了Kotlin插件,就能用来开发Kotlin编码的App工程。
2017年5月,谷歌宣布将Kotlin纳入Android Studio开发的官方语言,这意味着Android Studio对Kotlin的编译支持会大大增强,由此掀起了广大安卓开发者学习Kotlin编程的热潮。
2017年10月,Android Studio推出3.0正式版,从3.0版本开始,Android Studio自动集成Kotlin插件,在安装Android Studio 3.0时就连带配置了Kotlin的开发环境。
2017年11月,Kotlin语言推出1.2发布版,该版本的Kotlin具备更好的跨平台特性,编译性能也比1.1版提高了25%左右,同时也更好地支持Android开发。
1.2 Kotlin开发工具
本节主要介绍Kotlin开发环境的搭建以及Kotlin工程的基本操作,包括安装Android Studio的具体步骤、启动Android Studio的详细配置、如何创建一个Kotlin工程、如何新建各种Kotlin文件等。
1.2.1 安装Android Studio
Android Studio的官方下载页面是https://developer.android.google.cn/studio/index.html,在这里可以找到Android Studio的下载地址与使用教程。首先把最新版本的Android Studio下载到电脑本地,然后双击下载完成的Android Studio安装程序,弹出安装欢迎对话框,如图1-1所示。单击该对话框右下方的“Next”按钮,跳到下一页的许可同意对话框,单击“Agree”按钮,进入下一页的组件选择对话框,如图1-2所示。
全部勾选,然后单击“Next”按钮,跳转到安装路径配置对话框。建议将Android Studio安装在除系统盘外的其他磁盘,比如D盘,如图1-3所示,然后单击“Next”按钮。在下一个对话框中选择开始菜单的目录,这里使用默认的“Android Studio”,如图1-4所示,然后单击“Install”按钮,等待安装过程进行。
安装过程的进度对话框如图1-5所示,进度完成的结果对话框如图1-6所示,单击“Next”按钮结束安装操作。
安装完毕后弹出一个提示对话框,如图1-7所示,上面默认勾选了“Start Android Studio”,单击右下角的“Finish”按钮即可启动Android Studio。
1.2.2 启动Android Studio
首次安装Android Studio 3.0会弹出一个提示对话框,如图1-8所示,在此开发者可以选择从哪个目录导入之前的Android Studio设置。为了更好地演示完整的启动过程,这里选择最下面的选项“Do not import settings”,表示不导入任何已有设置,完全重新开始进行设置。
选好之后,单击提示对话框下方的“OK”按钮,Android Studio便执行启动操作,如图1-9所示。
因为前面选定了不导入任何设置重新开始,所以Android Studio将不会导入任何工程,而是弹出一个向导对话框,提示开发者去进行新的设置,如图1-10所示。单击“Next”按钮,进入下一页的安装类型对话框,如图1-11所示。
这里保持“Standard”选项,单击“Next”按钮,进入下一个对话框,如图1-12所示。继续单击“Next”按钮,进入向导的确认对话框,如图1-13所示。在该对话框确认SDK的安装路径是否正确,确认完毕单击“Finish”按钮,等待后续的SDK下载操作。
接下来的下载对话框会自动到谷歌网站更新组件,如图1-14所示。如果电脑本地没有SDK,就继续等待下载更新,如果电脑本地已有现成的SDK,就直接单击“Cancel”按钮取消下载,然后单击“Finish”按钮结束设置。最后弹出一个“Welcome to Android Studio”欢迎对话框,如图1-15所示。单击第一项的“Start a new Android Studio project”即可开始你的Android开发之旅。
1.2.3 创建Kotlin工程
1.2.2小节提到Android Studio启动设置完成之后,会弹出欢迎对话框提示创建新的Android工程,此时单击第一项的“Start a new Android Studio project”打开工程创建对话框,如图1-16所示。
在工程创建对话框中填写应用名称“Application name”以及公司域名“Company domain”,并选择或填写Android工程的本地保存路径“Project location”。注意,创建页面下方有两个选项“Include C++ support”和“Include Kotlin support”,其中勾选“Include C++ support”表示要进行NDK/JNI开发,但这不是本书的讲解范围,因此不必勾选该复选框;勾选“Include Kotlin support”则表示要进行Kotlin开发,因此务必勾选该复选框,才能继续后面的Kotlin开发学习。确认对话框中的各项信息都填写完毕,单击下方的“Next”按钮,进入目标设备对话框,如图1-17所示。
在目标设备对话框中,Android Studio默认勾选了“Phone and Tablet”,表示进行手机/平板应用开发,下面的API最低支持版本原本默认是API 15,不过因为如通知的新特性从API 16开始才支持,所以这里建议把最低版本改为API 16,接着单击“Next”按钮,进入初始风格对话框,如图1-18所示。
在初始风格对话框中选择“Empty Activity”,然后单击下方的“Next”按钮,进入名称配置对话框,如图1-19所示。
在名称配置对话框保持默认设置,即活动代码名称“Activity Name”仍然填写“MainActivity”,布局文件名称“Layout Name”仍然填写“activity_name”,然后单击“Finish”按钮,进入Android Studio的完整开发界面,如图1-20所示。
在编写代码的时候,Android Studio会自动编译。若开发者想手动重新编译,则有以下三种编译方式:
(1)选择菜单“Build”→“Make Project”,这个是编译整个项目下的所有模块。
(2)选择菜单“Build”→“Make Module ***”,这个是编译指定名称的模块。
(3)选择菜单“Build”→“Clean Project”,然后再选择菜单“Build”→“Rebuild Project”,这个是先清理项目,再对整个项目重新编译。
前面新创建的工程当然不会出现编译错误,直接运行就好了。先把手机通过数据线接入开发电脑的USB上,再依次选择菜单“Run”→“Run 'app'”,弹出目标设备选择对话框,列表中便会显示接入的手机设备,如图1-21所示。
单击“OK”按钮,执行测试App的安装操作,不出意外的话,一会儿即可在手机上看到测试应用的启动界面,具体效果如图1-22所示。
1.2.4 新建Kotlin文件
上一小节创建Kotlin工程后主要生成两个文件,一个是Kotlin代码文件MainActivity.kt,另一个是XML布局文件activity_name.xml。其中,MainActivity.kt就是扩展名为kt的Kotlin格式的代码文件,相对应地,Java代码文件的扩展名为java。这个MainActivity.kt是在创建工程时自动生成的,那么如何在已有工程中创建新的Kotlin文件呢?Kotlin代码文件可以分为两类:普通的Kotlin文件、用于页面Activity的文件,这两类Kotlin文件拥有各自的创建方式,具体说明如下。
1. 普通的Kotlin文件创建
右击待创建文件的包名,在弹出的快捷菜单中依次选择“New”→“Kotlin File/Class”,菜单界面如图1-23所示。
也可在顶部的主菜单栏上依次选择“New”→“Kotlin File/Class”,菜单界面如图1-24所示。
上述两种方式都会打开Kotlin文件的创建对话框,如图1-25所示。这里在“Name”输入框填写文件名称,在“Kind”下拉框中可单击弹出下拉列表,如图1-26所示,根据要求可选择对应的文件类型(File表示普通文件,Class表示类文件,Interface表示接口文件,Enum class表示枚举文件,Object表示对象文件),然后单击“OK”按钮完成文件创建操作。
2. 用于页面Activity的文件创建
选中待创建文件的包名,在顶部的主菜单栏上依次选择“New”→“Activity”→“Empty Activity”,菜单界面如图1-27所示。
然后打开活动Activity的创建对话框,如图1-28所示,分别在“Activity Name”和“Layout Name”两个输入框中填写活动名称与布局名称,并在下方的源码语言“Source Language”的下拉列表中选择“Kotlin”,表示新创建的Activity代码采用Kotlin编码。
确认好新Activity的创建信息,单击“Finish”按钮,Android Studio便会自动创建Kotlin代码文件MainActivity2.kt,以及与之对应的XML布局文件activity_name2.xml。创建后的工程文件结构如图1-29所示。
其实,Kotlin的文件创建还是很简单的,掌握这些基本的文件操作可以为后面的工具使用打好基础。
1.3 SDK安装与插件升级
本节主要介绍Android Studio 3.0环境对SDK和插件的安装升级说明,包括如何安装最新的SDK、如何升级Gradle插件、如何把Kotlin插件升级到最新版本等。
1.3.1 安装最新版SDK
由于目前官方的Android Studio 3.0安装包没有自带SDK,安装过程也只会去下载Android 8.0的SDK(API 26),因此如果读者是第一次安装Android Studio,就得自己另外安装最新版本的SDK。首先打开Android Studio,在界面右上角的工具栏中找到“SDK Manager”的图标,如图1-30所示。
单击该图标,打开Default Settings对话框,如图1-31所示,在对话框右侧的SDK列表中勾选最上面的SDK版本,比如“Android API 27”,然后单击右下角的“Apply”按钮,命令Android Studio执行该版本SDK的下载操作。
等待Android Studio下载并安装最新版本的SDK之后,重启Android Studio,即可正常使用该版本的SDK编译工程。
1.3.2 升级Gradle插件
Android Studio 3.0支持的Gradle插件版本至少为4.1,然而通常App工程自带的插件版本不能满足要求,使得Android Studio 3.0打开已有工程时往往要重新下载最新的Gradle插件,造成漫长的等待时间。与其让Android Studio老牛破车般地下载Gradle,不如自己动手将最新版的Gradle插件下载到本地,然后重新配置Gradle插件目录。具体步骤如下:
步骤01 打开电脑上的下载软件,输入Gradle 4.1的下载地址“http://downloads.gradle.org/ distributions/gradle-4.1-all.zip”,把这个4.1的压缩包下载到电脑本地,并解压该压缩包到指定目录,比如“D:\Android\gradle-4.1”。
步骤02 打开Android Studio,依次选择菜单“File”→“Settings”,打开设置对话框,在对话框左侧的菜单列表再依次选择“Build, Execution, Deployment”→“Gradle”,此时对话框右侧展示Gradle插件的配置界面,如图1-32所示。
步骤03 在Gradle配置界面上选中“Use local gradle distribution”,并在下方的“Gradle home:”输入框中填写前面gradle-4.1-all.zip的解压路径,例如“D:\Android\gradle-4.1”。
步骤04 单击Gradle配置界面右下方的“OK”按钮,完成Gradle插件的路径配置。
1.3.3 升级Kotlin插件
Android Studio虽然从3.0开始集成了Kotlin开发环境,但只是内置了某个版本的Kotlin插件。比如Android Studio 3.0.1集成的Kotlin插件版本为1.1.51,随着Kotlin语言的更新换代,它的插件也得跟着升级。如何在Android Studio上手动升级Kotlin插件呢?且看下面的具体步骤说明。
步骤01 依次选择菜单“File”→“Settings”,在弹出窗口右边的输入框中填写“kotlin”,从已安装插件里筛选出Kotlin插件,如图1-33所示,可见此时默认安装的Kotlin插件版本为1.1.51。
步骤02 插件设置下方有一排三个按钮,单击左边的“Install JetBrains plugin...”按钮,打开远程的插件资源窗口。在该窗口左上角的输入框中填写“Kotlin”,筛选出符合条件的插件列表,如图1-34所示。
步骤03 可见下方的插件列表会定位到符合搜索条件的插件位置,单击“Kotlin”(LANGUAGES),窗口右侧就会展示Kotlin插件的详细信息。发现远程插件库中的Kotlin最新版本为2017年11月28日推出的1.2版本,单击窗口右边的“Update”按钮执行升级操作。接着Android Studio开始自动下载Kotlin插件,下载过程如图1-35所示。
步骤04 等待Kotlin下载并更新完毕,此时原来的“Update”按钮变成了“Restart Android Studio”按钮,提示需要重启Android Studio使新插件生效,如图1-36所示。
步骤05 根据提示关闭Android Studio,再次启动Android Studio,即可在Android Studio使用最新版本的Kotlin插件。
1.4 Kotlin简单配置
本节主要介绍Android Studio 3.0环境对Kotlin的编译配置说明,包括如何通过菜单调整Kotlin编译配置、如何手工修改编译配置文件、如何将Java代码转换成Kotlin代码等。
1.4.1 调整Kotlin编译配置
1.3.3小节介绍了如何将Kotlin插件升级到最新版本,不过App工程采取的Kotlin编译版本不一定跟最新版本一致。因为Kotlin允许指定使用某个低版本来编译工程,就像Java即使已经推出1.9版本,也能使用1.8、1.7甚至1.6来编译Java工程。
调整App工程的Kotlin编译版本很简单,依次选择菜单“File”→“Settings”,在打开的窗口左侧菜单列表选中“Kotlin Compiler”,窗口右边便会打开Kotlin编译配置界面,如图1-37所示。
可以看到,“Language version”和“API version”目前选的都是1.1,表示当前App工程采用的Kotlin编译版本为1.1。
1.4.2 修改编译配置文件
只看菜单界面上的Kotlin编译配置还是不够直截了当,到底这个编译版本是在哪个文件里面配置的呢?先打开工程的编译配置文件build.gradle看看,该文件内容如图1-38所示。
图1-38所示的build.gradle文件内容是下面这样的:
buildscript {
//指定Kotlin插件的版本,这里是Android Studio 3.0.1默认的1.1.51
ext.kotlin_version = '1.1.51'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//指定Kotlin插件的路径
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin: $kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
正如图1-38框中标记的那样,Kotlin工程的编译配置文件比Java编写的App工程多了两处修改,说明如下:
(1)定义了一个外部变量ext.kotlin_version,其值为Kotlin编译版本号“1.1.51”。
(2)指定了Kotlin插件的编译路径,即“org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_ version”。
可是仅仅修改工程级别的build.gradle是不够的。再看看模块级别的build.gradle,该文件内容如图1-39和图1-40所示,其中图1-39所示为文件开头部分的截图,图1-40所示为文件末尾dependencies块的截图。
注意图1-39和图1-40框中的部分,这里依然有两个地方与众不同,说明如下:
(1)文件开头增加了两个插件,即'kotlin-android'和'kotlin-android-extensions',表示该模块会运用Kotlin插件功能。补充Kotlin插件声明后的文件头部如下所示:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
(2)文件末尾的dependencies块增加了Kotlin插件库的编译声明,具体声明语句如下所示:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
综上所述,Kotlin工程与Java编写的App工程相比,一共要调整两个build.gradle的4处编译配置,方能正常支持Kotlin代码的编译运行。
1.4.3 Java代码转Kotlin代码
前面介绍了Kotlin工程的编译配置说明,如果现在有一个Java编码的App工程,要如何将其转换为Kotlin工程呢?
假设读者目前还没有Kotlin基础,那么按照App开发的常规流程,先创建一个新模块,依次选择菜单“File”→“New”→“New Module”,然后一路单击“Next”按钮完成模块创建。再按照“1.4.2修改编译配置文件”的说明,给这个新模块添加Kotlin编译支持。接着打开MainActivity.java,这个文件的内容再熟悉不过了,就是最简单的几行Java代码,如下所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
现在我们要移花接木,把Java代码转换为Kotlin代码。先选中MainActivity.java,再到主界面上依次选择菜单“Code”→“Convert Java File to Kotlin File”,菜单位置如图1-41所示。
代码转换完毕,原来的MainActivity.java变成了MainActivity.kt,文件内容也变成了如下所示的Kotlin代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
看起来,这个Kotlin的语法与Java似曾相识,但又有所不同。若想解释Kotlin的详细语法规则,可参见本书第2章到第5章的语法部分。这里先把DEMO跑起来再说,依次选择菜单“Run”→“Run 'hello'”启动应用,正常的话,可在接入的模拟器或者真机上看到“Hello World!”,如图1-42所示。
怎么样,这可是一个货真价实的用Kotlin开发的App,都说万事开头难,搭建好Kotlin的开发环境,只是万里长征的第一步,在下面的章节中,我们将继续学习如何使用Kotlin进行Android开发。
1.5 Kotlin相关技术
本节主要介绍Kotlin语言在编码过程中运用的一些相关技术,首先对Kotlin代码与Java代码进行编程效率的比较,然后分别阐述Kotlin采用的Anko库以及Lambda表达式的相关概念以及具体用法。
1.5.1 Kotlin代码与Java代码PK
前面介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android Studio上使用Java进行编码本来就是理所应当的,何必还要专门弄个Kotlin,这个Kotlin相比Java到底有哪些好处呢?
我们可以把Kotlin看作是Java的升级版,它不但完全兼容Java,而且极大地精简了代码语法,从而使开发者专注于业务逻辑的编码,无须在烦琐的代码框架之间周旋。当然,若想充分运用Kotlin的优异特性,除了导入Kotlin的核心库外,还得导入Kotlin的扩展库与Anko库。具体到编译配置文件,则要进行以下两处修改:
(1)打开项目的build.gradle,补充添加Anko库的版本号声明,以及Kotlin扩展库的路径,完整的编译配置如下所示:
buildscript {
ext.kotlin_version = "1.2" //指定Kotlin的编译版本号
ext.anko_version = "0.9" //指定Anko库的版本号
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin: $kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions: $kotlin_version"
}
}
(2)打开模块的build.gradle,在文件开头补充添加Kotlin的扩展插件,配置添加示例如下:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
接着在dependencies节点下补充添加Kotlin与Anko插件的编译说明,如下所示:
//Android Studio 3.0开始使用implementation,2.*版本使用compile
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.anko:anko-common:$anko_version"
编译配置修改完毕,接下来尝试进行简单的Kotlin编码,看看Kotlin的代码究竟有多么的简练。
首先按照前面“1.2.4 新建Kotlin文件”小节的描述,给该模块创建一个名称为EasyActivity.kt的Kotlin文件,对应的布局文件名则为activity_easy.xml。然后给布局文件activity_easy.xml添加几个TextView和Button控件,布局比较简单,可参考本书下载资源中的源代码。
接下来是本小节的重点,以前开发者在操纵控件时,都要先通过findViewById方法获得控件对象,再调用相关函数设置对象属性。比如现在有一个名为tv_hello的TextView控件,准备在代码中把tv_hello的显示文本改为“你好呀”,如果用Java编码,就是下面几行代码:
TextView tv_hello = (TextView) findViewById(R.id.tv_hello);
tv_hello.setText("你好呀");
如果用Kotlin修改文本这个功能,实现会是怎么样的呢?下面就让我们实验一下。首先在EasyActivity.kt代码开头补充下面一行:
import kotlinx.android.synthetic.main.activity_easy.*
这行导入语句的目的是引进Kotlin的控件变量自动映射功能,接下来的代码就无须再调用findViewById方法,直接把控件ID当作控件对象使用即可。比如修改TextView的显示文本,采用Kotlin编码只要下面一行:
tv_hello.setText("你好呀")
如此一来,原来的两行代码精简到一行代码,去掉了原先获取控件对象的冗余代码。然而Kotlin的便利性并不仅限于此,它对控件甚至都无须调用set***/get***方法,而允许直接修改/获取控件的属性值,如设置文本这个功能,可以继续简化为下面这行代码:
tv_hello.text = "你好呀"
进一步简化之后,原代码的“set”与两个括号都被去除,但是新代码反而更容易理解了。
也许有人说,Kotlin在这里只精简了一行代码,不见得比Java有多大优势,那就继续进行其他常见功能的PK,有道是五局三胜,赢得多才足以服众。上面的第一局为修改控件文本的PK,结果是Kotlin小胜;接下来再设四局PK,其中第二局为点击监听器的处理。Button是Android的常用按钮控件,代码中经常要处理Button控件的点击事件,下面的Java代码就是响应Button点击的一个例子:
final Button btn_click = (Button) findViewById(R.id.btn_click);
btn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_click.setText("您点了一下下");
}
});
其实这个响应功能很简单,仅仅在点击按钮时修改按钮文本而已,可是因为Java需要实现点击监听器,所以无奈还得写好几行的匿名类代码。如果使用Kotlin实现相同的功能,又是怎样的呢?且看下面的Kotlin代码:
btn_click.setOnClickListener { btn_click.text="您点了一下下" }
不得了了,Kotlin只需一行代码就完事,想不到吧,此局Kotlin完胜。
第三局换个Button控件的长按事件,下面的Java代码是响应Button长按的一个例子:
final Button btn_click_long = (Button) findViewById(R.id.btn_click_long);
btn_click_long.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
btn_click_long.setText("您长按了一小会");
return true;
}
});
可以看到Java代码依旧冗长,再看看Kotlin代码如何接招:
btn_click_long.setOnLongClickListener { btn_click_long.text="您长按了一小会"; true }
Kotlin仍旧一行代码搞定,真是叫人刮目相看,此局Kotlin依然完胜。
第四局咱不比监听器了,Java在匿名类这块很吃亏,那来比另一种常用的Toast提示功能,该功能的Java代码只有一行:
final Button btn_toast = (Button) findViewById(R.id.btn_toast);
btn_toast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(EasyJavaActivity.this, "小提示:您点了一下下", Toast.LENGTH_SHORT).show();
}
});
上面外层的点击监听器请忽略,正宗的Toast代码真的只有一行,且看Kotlin怎么拆招:
btn_toast.setOnClickListener { toast("小提示:您点了一下下") }
哈哈,Kotlin连同监听器的代码,比Java的一行Toast代码都要少,此局Kotlin继续小胜。
可是为什么Kotlin的toast函数不区分显示时长呢?原来toast方法默认为短时显示,即Toast.LENGTH_SHORT。这下Java方窃喜,虽然我的代码比较长,但是足够灵活呀,想要短一点就LENGTH_SHORT,想要长一点就LENGTH_LONG。正好第五局比试Toast的长时提示,该功能的Java代码也只有一行Toast:
final Button btn_toast_long = (Button) findViewById(R.id.btn_toast_long);
btn_toast_long.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(EasyJavaActivity.this, "长提示:您长按了一小会", Toast.LENGTH_LONG).show();
return true;
}
});
现在Kotlin没法调用toast函数了吧,Java洋洋自得总算能够扳回一局,谁料Kotlin大喝一声“看我来”:
btn_toast_long.setOnLongClickListener { longToast("长提示:您长按了一小会"); true }
真是未曾想到,Kotlin另外有一个longToast招式,仅仅多了4个字母而已,于是此局Kotlin理应小胜。
五局PK下来,Kotlin大获全胜,Java溃不成军,直教人长吁短叹“长江后浪推前浪,前浪死在沙滩上”。
1.5.2 Anko库
Anko是使用Kotlin语言编写的一个Android增强库,它用于简化Android开发时的Kotlin代码,使得开发者只用较少的Kotlin代码便能表达完整的编程含义,同时也让App代码变得更加简洁易懂。
例如1.5.1小节的toast和longToast,这两个函数就在Anko库中定义。对于toast函数,它在Anko库中的原始定义是下面这样的:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
对于longToast函数,它在Anko库中的原始定义是下面这样的:
fun Context.longToast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_LONG).show()
注意到Anko库的Toasts.kt文件是给Context类添加了扩展函数toast和longToast,这意味着凡是继承了Context的类(包括Activity、Service等),均可在类内部代码直接调用toast和longToast方法实现弹窗提示效果,而不必额外声明工具类对象。
为了正常地使用toast和longToast函数,要在代码文件头部加上下面两行导入语句:
import org.jetbrains.anko.toast
import org.jetbrains.anko.longToast
另外,修改项目的build.gradle,在buildscript节点中补充下面一行的Anko库版本号定义:
ext.anko_version = "0.9" //指定Anko库的版本号
同时,修改模块的build.gradle,在dependencies节点中补充下述的anko-common包编译配置:
compile "org.jetbrains.anko:anko-common:$anko_version"
当然,读者刚看到这里的时候,应该还不具备多少Kotlin基础,尚无法理解Kotlin的扩展函数与类继承的用法。此处介绍Anko库的目的只是告诉读者有这么一种增强库,具体的Kotlin语法在后续章节会进行详细和深入的介绍。
1.5.3 Lambda表达式
Lambda表达式其实是一个匿名函数,匿名函数指的是:它是一个没有名字的函数,但函数体的内部代码是完整的。可是常规的函数调用都必须指定函数名称,既然匿名函数不存在函数名称,那么其他地方怎样调用它呢?为解答这个问题,先来看看Android处理按钮点击事件的Java代码片段:
btn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_click.setText("您点了一下下");
}
});
上面的代码段摘录于之前的“1.5.1 Kotlin代码与Java代码PK”小节,显然Java的这种写法太过啰嗦,既创建类实例又重写onClick函数。其实此处的业务逻辑很简单,仅仅是发生点击事件时修改一下按钮文本就好了,监听代码何必要搞得这么复杂呢?出现该现象的缘由是,Java是一个纯面向对象的语言,因此它必须按照面向对象的完整写法老老实实地继承类,然后声明类实例,最后重载函数。
Java设计人员为了保持Java代码的严谨性和连贯性,对于上述代码的情况一直只能这么处理。经过多年努力,Java的设计者终于找到了符合Java编程习惯的Lambda表达式,也就是简化后的Java编码,其中把多余的实例声明与函数重载部分统统去掉,只留下与业务相关的核心代码,从而形成了下面的Lambda表达式代码:
btn_click.setOnClickListener((View v) -> {
btn_click.setText("您点了一下下");
});
初步精简后的Lambda表达式代码只保留了onClick函数的输入参数与函数内部代码(二者之间通过“->”连接),连函数名称也被省略掉了。注意到函数内部未使用输入参数v,所以完全可以把没用的输入参数去掉,于是上面的Lambda代码便进一步简化成下面这样:
btn_click.setOnClickListener({
btn_click.setText("您点了一下下");
});
虽然以上的Lambda代码已经够短了,可是仍旧存在改进的空间。仔细观察发现setOnClickListener函数在圆括号内部又包了一层花括号,两层括号紧紧贴在一起纯属浪费,因此完全可以把两层括号简写为一层花括号,简写后的Lambda代码如下所示:
btn_click.setOnClickListener{
btn_click.setText("您点了一下下");
};
至此,采取Lambda表达式的Java点击事件处理代码已经跟下面的Kotlin代码很接近了:
btn_click.setOnClickListener { btn_click.text="您点了一下下" }
Java从1.8开始支持Lambda表达式,如果Android Studio采取JDK 1.7进行App开发,Java编码是不能使用Lambda表达式的。由于Kotlin从一诞生就支持Lambda表达式,因此并不在乎JDK版本是1.7还是1.8,只要采用最新版本的Kotlin编译,都能正常使用Lambda表达式。
1.6 小结
本章主要介绍了Kotlin开发环境(即Android Studio)的环境搭建,包括Kotlin与Android开发的关系、如何安装与配置Android Studio、如何创建Kotlin工程与Kotlin文件、如何升级和配置Android Studio上的Kotlin插件、如何调整Kotlin工程的编译配置,并借此初步认识到利用Kotlin开发App带来的巨大好处。
通过本章的学习,读者应该学会基于Android Studio环境的Kotlin基本操作步骤,能够正确配置、编译和运行Kotlin编码的App工程,并具备进一步提高的学习基础。
网友评论