在今年的 Google I/O 大会上宣布 Kotlin 为 Android 开发的第一语言,既然官方都已经选择了它,我们正在学习 Android 的和 Android 开发者们自然就要了解如何使用它。
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。
Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制:
因为我们这里介绍的是 Kotlin 在 Android 中的使用,所以对 Kotlin 的介绍就不深入了,有兴趣的可以上它的官网查阅更多资料,它的中文社区可以看看。就开始谈 Kotlin 的环境配置。
现在我们要在 Android Studio 中使用 Kotlin 第一步需要为它添加 Kotlin 的插件,相信大家都对安装插件很熟悉了,打开 setting,选择 plugins,搜索 Kotlin:
我安装了以前的版本,如果你没有安装过 Kotlin 的插件,那显示的就是 install,等一段时间下载好,重启下 Android Studio,我们可以看到:
在创建的工程里第一次使用 Kotlin,类创建好后会显示“Kotlin not configured”,点击“Configure”,进入Kotlin配置页面。
根据需要选择需要配置的范围,全部模块或单个模块,然后确定。配置完成后会自动在这个工程下的 build.gradle 与 moudle 下的build.gradle下配置相应的参数。
Project 下的 build.gradle:
module下的 build.gradle:
现在我们就可以在 Android Studio 中使用 Kotlin,我们新建一个 Kotlin Activity,运行一下;
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
因为是百分百兼容 Java,所以我们在 xml 中的设置并没有变化,同样的布局文件在 Java 和 Kotlin 中都可以使用。
Kotlin 完全兼容了 Java,我们在 Java 中可以使用的类在 Kotlin 中同样可以使用,不过代码的格式就不太一样了。
Kotlin 中先写出类名或变量名,在“:”后面是要继承或使用的类,实现多个接口用“,”连接即可。
class MainActivity : AppCompatActivity() {
private lateinit var mTextView : TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mTextView = findViewById(R.id.hello) as TextView
mTextView.text = "Hello Kotlin"
}
}
因为 TextView 的初始化只能在 onCreate() 中,所以我们就要用到 lateinit 关键字。
对于非空类型的属性是必须初始化的。如果我们希望延迟进行初始化,就可以使用 lateinit 关键字了。lateinit 只能在不可null的对象上使用,必须为 var,不能为 primitives(Int、Float等基本类型):
private val count : Int = 3
var 表示变量,也就是既可以 get 也可以 set;val 表示常量,就只有 getter 方法啦。
如果不使用 lateinit 还有比较麻烦的方法,用“TextView?”说明我们先不对这个变量做处理先设为 null,但之后使用时就需要对它做空异常判断。
class MainActivity : AppCompatActivity() {
private var mTextView : TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mTextView = findViewById(R.id.hello) as TextView
mTextView!!.text = "Hello Kotlin"
}
}
Kotlin 可以直接对一些有 getter 和 setter 方法的属性做操作,也可以调用各种类的方法:
mTextView.setText("Hello Kotlin")
mTextView.setTextColor(Color.BLUE)
mTextView.setTextSize(20f)
Kotlin 和 Java 基本语法的不同大都在初始命名上面,熟悉后还是很简便的。
Anko 是一个使开发Android应用更简单更快捷的库,它可以实现很多对界面的操作,使用它是用 Kotlin 来写,要使用我们先要添加依赖:
compile "org.jetbrains.anko:anko-sdk23:0.9"
我们这里简单了解一下它的作用:
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
这样使用 Kotlin,name 就变成了一个 EditText 对象,界面也会变成这样:
我们使用 Anko 还可以简化 findViewById 的操作:
mTextView = find(R.id.hello)
这里再介绍一个 Kotlin 的插件——kotlin-android-extensions,让我们用更少的代码来开发程序 。该插件自动创建了很多的属性来让我们直接访问XML中的view。因此不需要你在布局中去找到这些view。
该插件会代替任何属性调用函数,比如获取到view并具有缓存功能,以免每次属性被调用都会去重新获取这个view。这个缓存装置只会在Activity或者Fragment中才有效。
首先我们在 build.gradle 中声明使用这个插件:
apply plugin: 'kotlin-android-extensions'
这样我们就可以直接用布局文件中设置的控件 ID 来控制 View 啦:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
hello.setText("Hello Kotlin")
hello.setTextColor(Color.BLUE)
hello.setTextSize(20f)
}
}
hello 就是布局中的 TextView的 ID。
Java 中,NullPointerException 可以说是最常见的异常了,一旦出现,程序就会崩溃,所以我们总要对那些有可能是 Null 的变量进行非空判断,我从网上 copy 了一个例子:
public void test(String string) {
if (string != null) {
char[] chars = string.toCharArray();
if (chars.length > 10) {
System.out.println(((Character)chars[10]).hashCode());
}
}
}
虽然判断并不复杂,但变量一多了,就很容易忽略掉,事后处理不一定能快速解决。而 Kotlin 中空指针异常得到了很好的解决。
看看相同效果的代码用 Kotlin 是怎么实现的:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")
}
fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}
}
testNullSafeOperator() 方法的效果是一样的,不过可以看到我们并没有自己去做 NULL 判断,这个结果为:
null
49
null
从结果可见,并没有像 Java 那样抛出 NullPointerException,而是遇到空指针则不继续执行了。
我们下载了 Kotlin 插件后,会增添一个 Kotlin 工具,有个功能可以把 Kotlin 代码转化为字节码,还提供给我们反编译为 Java 的功能,我们对比就可以知道“?”做了什么。
我们看了字节码和 Java 代码可以知道其实并不是没有做空指针判断,而是空指针安全操作符“?”内部为我们完成了这些。
这篇博客就到这里,关于 Kotlin 我是在 Google I/O 大会后才开始知道它的,虽然它有很多与 Java 相同的东西,不过也有很多变化。了解我上面提到的已经可以进行项目开发,但身为一个合格的开发者,是不能满足于此的,我们还要一步步学好 Kotlin,这里有个资源博客Kotlin 资源大全。关于基础语法可以看看这个Kotlin基础语法。
结束语:本文仅用来学习记录,参考查阅。