在 Android 上开始使用 Kotlin

本文翻译自:https://developer.android.com/kotlin/get-started.html

Android Studio 3.0 完整的支持 Kotlin,因此下面的这些操作都很方便。包括通过 Kotlin 文件创建新的项目,添加新的 Kotlin 文件到已有项目中,或者将 Java 语言代码转为 Kotlin。同时,你也可以针对 Kotlin 代码来使用所有 Android Studio已有的工具,如自动补全,lint 检查,重构,调试等。

这篇文章将介绍如何再 Android Studio 中开始使用 Kotlin。

创建新项目来使用 Kotlin

在新项目中使用 Kotlin,仅需要在新项目向导中一个额外的点击:

  1. 在 Android Studio 中,点击文件(File) > 新建(New) > 新项目(New Project)。或者你刚刚打开 Android Studio,看到了 Android Studio 的欢迎窗口,那么点击开始一个新的 Android Studio 项目
  2. 在第一个屏幕,选中包含 Kotlin 支持(Include Kotlin Support)。就只有这一个唯一的区别。
  3. 点击下一步(Next)并继续后面的向导直到结束。

kotlin-new-project

当你选择了一个 Activity 模板,它将以 Kotlin 代码提供。现在,至于一些手机和平板的模板提供了惯用的 Kotlin 代码。其他的则是从 Java 模板自动转化为 Kotlin。你仍然得到的是 Kotlin 代码,但是某些代码没有使用 Kotlin 最佳的语言特性。

与 Java 文件一样,Kotlin 文件被保存在 src/main/java/ 目录下。

在现有项目中添加 Kotlin

如果你想要添加 Kotlin 代码到现有的项目中,简单点击文件(File) > 新建(New),并从中选择一个 Android 模板。如果你没有在菜单中看到模板列表,需要先打开项目(Project)窗口,并选择你的 App 模块。

new-template-menu

在展示的向导中,为源代码(Source Language)选择 Kotlin。

kotlin-new-activity

继续后面的向导,直到结束。

此外,你可以点击文件(File) > 新建(New) > Kotlin文件/类(Kotlin File/Class)来创建基础文件。新建Kotlin文件/类窗口提供了不同文件类型的选择,但不用太在意你选择了那种文件。因为当你以后改变了声明方式, Kotlin 会自动切换文件类型。

默认情况下,新的 Kotlin 文件会被保存在 src/main/java/ 中。你会发现 Kotlin 和 Java 文件在一个位置。如果你更喜欢将 Kotlin 文件与 Java 文件分开,你可以把 Kotlin 文件放到 src/main/kotlin/ 目录下。这样做,你需要修改 sourceSets 的配置来包含该目录。

1
2
3
4
5
android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}

转换现有的 Java 代码为 Kotlin 代码

在 Android Studio 3.0 中,打开 Java 文件,并且选择代码(Code) > 转换 Java 文件为 Kotlin 文件

或者创建新的 Kotlin 文件(File > New > Kotlin File/Class),然后粘贴 Java 代码到该文件里,当弹出提示时,点击来转换代码到 Kotlin。你可以选中下次不再显示该对话框来取消同样操作时的提示。

kotlin-convert

Kotlin 如何来使用 Android API

Kotlin 提供了与 Java 语言完整的互操作性,所以调用 Android API 看起来与 Java 代码几乎一样。此外,你还可以将这些方法调用与Kotlin的语法特征相结合。

下面是一些如何在 Kotlin 中调用 Android API 的例子,同时对比 Java 的相同代码。

在 Kotlin 中声明 Activity

1
2
3
4
5
6
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity)
}
}

在 Java 中声明 Activity

1
2
3
4
5
6
7
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
}
}

Kotlin 中的 On-click listener

1
2
3
4
val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener {
...
}

Java 中的 On-click listener

1
2
3
4
5
6
7
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
});

Kotlin 中的 Item click listener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private val mOnNavigationItemSelectedListener
= BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
mTextMessage.setText(R.string.title_home)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_dashboard -> {
mTextMessage.setText(R.string.title_dashboard)
return@OnNavigationItemSelectedListener true
}
}
false
}

Java 中的 Item click listener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
mTextMessage.setText(R.string.title_home);
return true;
case R.id.navigation_dashboard:
mTextMessage.setText(R.string.title_dashboard);
return true;
}
return false;
}
};

如果你还没有入坑,那我告诉你,是时候学习 Kotlin 了。

Kotlin 中文文档

写给 Android 开发者的 Kotlin 教程