尽管绝大多数Android应用都是用Java编写的,但并没有规定您必须使用Java进行Android开发。 有多种现代编程语言可以在Java虚拟机(JVM)上运行,而Kotlin是Java社区中流行的一种语言。

在这个由三部分组成的系列的第一部分中,我们研究了Kotlin是什么以及它为Android开发人员提供了什么:

  • 它可以与Java 100%互换,以至于您可以继续使用现有的Java库和框架,甚至可以在Android项目中混合使用Java和Kotlin代码。
  • 它的语法设计与Java非常相似,这意味着Java开发人员应该很容易掌握Kotlin的基础知识。
  • 它结合了功能和过程编程的功能和概念。
  • Android Studio提供了很好的支持。

在此后续教程中,我们将开始一些实际的Kotlin开发。 到本教程结束时,您将创建一个简单的Android应用程序,该应用程序显示一行文本,并且完全用Kotlin编写。 您还将了解如何避免使用Kotlin的Android扩展来编写另一个findViewById

但是首先是时候教我们的开发环境如何说一种新语言了!

在Android Studio中安装Kotlin插件

您需要做的第一件事就是将Kotlin支持添加到您的Android Studio安装中。

在开始之前,请确保您正在运行最新的稳定版Android Studio,因为您更有可能在Android Studio实验版上遇到Kotlin插件的错误。 还值得打开SDK Manager并检查更新是否适用于已安装的任何软件包。

一旦确定自己的开发环境是最新的,就可以安装Kotlin插件了。 启动Android Studio,您应该会看到“ 欢迎使用Android Studio”窗口-如果未出现此窗口,请完全关闭Android Studio并重新启动。

单击“ 配置”图标,然后从随后的下拉列表中选择“ 插件 ”。



android kotlin 获取软件版本 基于kotlin的android应用程序开发_移动开发


单击“ 安装JetBrains插件...”按钮。



android kotlin 获取软件版本 基于kotlin的android应用程序开发_android_02


从菜单中选择Kotlin ,然后单击绿色的Install(安装)按钮。 您需要在Kotlin插件激活之前重新启动IDE,所以请单击出现的Restart Android Studio按钮或手动重新启动IDE。

配置项目以使用Kotlin

此时,您的IDE可以理解并运行Kotlin代码,但是每次您要在新项目中使用Kotlin时,仍然需要配置Kotlin。 让我们创建一个新项目,并配置该项目以立即使用Kotlin。 使用您选择的设置创建一个新项目,但是为了简单起见,在出现提示时选择Empty Activity

多亏了Kotlin插件,配置项目才能使用Kotlin变得更加简单:只需从Android Studio工具栏中选择Tools ,然后在Project中选择KotlinConfigure Kotlin。



android kotlin 获取软件版本 基于kotlin的android应用程序开发_编程语言_03


这将打开一个弹出窗口,您可以在其中选择配置Kotlin以进行以下操作:

  • 所有模块
  • 所有包含Kotlin文件的模块
  • 或单个命名模块

由于我在项目中使用Kotlin代码,因此我选择了All modules 。 您还可以选择要使用的Kotlin版本-通常,这是最新版本。

或者,您可以通过从Android Studio菜单栏中选择“ 帮助 ,然后选择“ 查找动作”配置Kotlin 在“ 查找动作”栏中,开始在Project中键入Configure Kotlin ,然后在出现时选择此选项。

在项目中配置Kotlin选项对项目的build.gradle文件进行了许多调整,因此让我们仔细看一下这些文件的更改方式。 打开您的项目级别的build.gradle文件-它应如下所示:

buildscript {

  //Declares the version of Kotlin that you’re using. You’ll notice that the version of Kotlin is mentioned in both the buildscript classpath and in your project’s compile dependencies - the version number must be the same in both places//
  ext.kotlin_version = '1.0.5-2'
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.2.2'
    
    //Declares the Kotlin Gradle plugin as a classpath dependency//
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  }
}

allprojects {
  repositories {
     jcenter()
  }
}

现在,让我们看一下您的模块级build.gradle文件:

apply plugin: 'com.android.application'

//Applies the Kotlin Android plugin//
apply plugin: 'kotlin-android'

android {
  compileSdkVersion 25
  buildToolsVersion "24.0.0"

  defaultConfig {
    applicationId "com.jessicathornsby.kotlinexample"
    minSdkVersion 21
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
  }

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }

  //Although Gradle will compile any Kotlin files it finds in src/main/java, it’s good practice to store your Kotlin files in a dedicated Kotlin directory. Here, you can see that the Kotlin plugin has added a src/main/kotlin declaration to build.gradle, but note that it hasn’t actually created this directory, so we’ll create it ourselves later in this article//
  sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
  })

  compile 'com.android.support:appcompat-v7:25.0.1'
  testCompile 'junit:junit:4.12'

  //Adds the Kotlin Standard Library as a project dependency//
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
repositories {
  mavenCentral()
}

最后,通过单击出现的弹出窗口中的立即同步或单击Android Studio工具栏中的与Gradle文件同步项目图标来同步您的更改。

将任何Java文件转换为Kotlin

Kotlin插件的一个功能对Kotlin新手特别有用,它可以将任何Java源文件转换为Kotlin,同时又能保持完整的运行时兼容性。

能够准确查看任何 Java文件如何转换成Kotlin是帮助您学习该语言的理想之选,但是在您努力学习如何用Kotlin编写东西的过程中,它在整个Kotlin旅程中也很有用,您总是可以用Java编写代码,然后使用此功能将该代码转换为Kotlin。

让我们将项目的MainActivity文件转换为Kotlin源文件。 有两种方法可以调用Kotlin插件的“ 将Java文件转换为Kotlin文件”操作,因此可以选择以下两种方法:

  • 选择您的MainActivity文件,然后从Android Studio的菜单栏中选择代码 ,然后选择将Java文件转换为Kotlin文件

android kotlin 获取软件版本 基于kotlin的android应用程序开发_python_04


  • 或从Android Studio菜单栏中选择“ 帮助 ”,然后选择“ 查找操作” 。 在随后的弹出窗口中,开始键入将Java文件转换为Kotlin文件 ,然后在出现时选择此选项。 请注意,您还可以使用键盘快捷键启动“ 查找操作”弹出窗口:如果您使用的是Mac,请按Command-Shift-A键;如果您使用的是Windows或Linux,请按Control-Shift-A

请注意,根据代码的复杂程度,转换可能并不总是100%准确,因此您应始终检查转换后的代码是否有错误。

您新转换的MainActivity应该如下所示:

import android.support.v7.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
  }
}

您还将注意到文件的扩展名已更改,从MainActivity.java转换为MainActivity.kt

这可能是一个简单的Activity ,但是以下几行说明了Kotlin语法的一些关键特征。 由于这是我们首先看一些实际的Kotlin代码,因此让我们逐行挑选此类。

了解Kotlin语法

在Kotlin中,您可以使用关键字class声明类,就像在Java中一样。 但是,在Kotlin中,默认情况下,类(和方法)是公共的且是final的,因此您只需编写class MainActivity即可创建一个类。

在扩展类时,可以用冒号替换Java的extends ,然后附加父类的名称。 因此,在MainActivity.kt文件的第一行中,我们将创建一个公共的最终类MainActivity ,该类扩展了AppCompatActivity

class MainActivity : AppCompatActivity() {

Java等效项为:

public class MainActivity extends AppCompatActivity {

如果确实要覆盖类或方法,则需要将其显式声明为open或abstract。

在Kotlin中,使用fun关键字定义函数,后跟函数名称和方括号中的参数。 在Kotlin中,函数名称位于其类型之前:

override fun onCreate(savedInstanceState: Bundle?) {

这与Java相反,在Java中,类型在名称之前:

public void onCreate(Bundle savedInstanceState)

请注意,我们并未指定此方法为final,因为在Kotlin中,所有方法默认都是final。

本活动的其余部分看起来与Java非常相似。 但是,以下几行确实说明了Kotlin的另一个关键特征:

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

在Kotlin中,您不需要以分号结尾,因此上述代码段中没有冒号。 如果确实需要,可以添加冒号,但是如果没有冒号,您的代码将更加清晰易读。

现在,我们已经解密了MainActivity.kt文件,让我们将其移至正确的位置。 由于Kotlin插件难以在我们的build.gradle文件中添加src / main / kotlin声明,因此让我们实际创建该目录。 此步骤不是强制性的,但是将Kotlin文件保存在专用目录中将使项目更整洁。

在Android Studio的项目资源管理器中按住Control键并单击项目的目录,然后从出现的菜单中选择新建 ,然后选择目录 。 将此目录命名为kotlin ,然后单击“ 确定”



android kotlin 获取软件版本 基于kotlin的android应用程序开发_移动开发_05


如果您难以找到项目的目录,请打开Project Explorer左上角的小下拉菜单,然后选择Project 。 现在,发现该难以捉摸的src / main目录应该没有任何问题。



android kotlin 获取软件版本 基于kotlin的android应用程序开发_编程语言_06


创建专用的Kotlin目录后,将MainActivity.kt文件拖入其中。 只需确保保留MainActivity.kt文件的现有程序包名称,即可使您的项目继续运行。

另外,如果您仅打算在该项目中使用Kotlin,则可能要删除Java目录,而不是用空目录和不必要的目录来弄乱项目。

由于Kotlin会编译为字节码,因此使用Kotlin编写的应用程序与使用Java编写的应用程序完全相同,因此请尝试在您的Android设备或兼容的AVD上安装此应用程序-感觉好像什么都没有改变。

创建额外的Kotlin文件

如果您继续在项目中使用Kotlin,那么迟早将需要开始创建新的Kotlin文件,而不是简单地转换现有的Java文件。

要创建Kotlin文件,请按住Control键并单击 app / src / main / kotlin目录,然后选择新建> Kotlin活动



android kotlin 获取软件版本 基于kotlin的android应用程序开发_移动开发_07


为您的班级命名,然后从下拉菜单中选择班级 。 您的新课程应如下所示:

class SecondActivity {

}

此时,您的活动为空。 为了使您可以开始添加一些实际功能,您需要完成一些步骤。 首先,添加要使用的import语句。 Kotlin中的import语句和Java中的import语句之间的唯一区别是,您不需要用分号结束每一行。 例如:

import android.app.Activity
import android.os.Bundle
import android.app.Activity

然后,您需要使用我们在MainActivity.kt文件中看到的相同格式,指定要扩展的类:

class SecondActivity : Activity() {
 
}

接下来,您需要覆盖Activity的onCreate方法:

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
}

现在,您可以在此活动中添加所需的任何功能(在下一节中,我将向您展示如何使用Kotlin扩展来操纵UI窗口小部件,因此这可能是一个不错的起点),但最后一点设置是您需要完成的是在清单中声明Kotlin活动。 例如,这遵循与声明新的Java活动完全相同的公式:

<activity
       android:name=".SecondActivity"
       android:label="@string/second"
       android:parentActivityName=".MainActivity">
     <meta-data
         android:name="android.support.PARENT_ACTIVITY"
         android:value=".MainActivity"/>
   </activity>

Kotlin Android扩展:告别findViewById

现在,我们已经掌握了基础知识,让我们仔细看一下Kotlin的真正功能-从一个可以真正减少您需要编写的样板代码数量的功能开始。

在Android中,每次要在Activity中使用任何View时,都需要使用findViewById方法来获取对该视图的引用。 这使findViewById成为最重要的代码之一,也是最令人沮丧的代码之一,您会发现自己在Android项目中一遍又一遍地编写。 findViewById方法是大量潜在错误的来源,如果您在同一个Activity中使用多个UI元素,则所有这些findViewById都会使您的代码混乱,从而难以阅读。

尽管有许多库(例如Butter Knife)旨在消除对findViewById的需求,但是这些库仍然需要您为每个View注释字段,这可能会导致错误,并且仍然需要付出很多努力。会更好地投资于您项目的其他领域。

Kotlin Android扩展插件(最近已并入标准Kotlin插件中)有望使findViewById成为过去,为您提供上述库的好处,而无需编写任何其他代码或提供其他运行时的缺点。

您可以使用Kotlin扩展名将View引用导入到您的源文件中。 此时,Kotlin插件将创建一组“综合属性”,使您可以将这些视图当作活动的一部分来使用-至关重要的是,这意味着您不再需要使用findViewById来定位每个View使用它。

要使用扩展,您需要在每个模块中启用Kotlin Android扩展插件,因此打开您的模块级build.gradle文件并添加以下内容:

apply plugin: 'kotlin-android-extensions'

通过单击立即同步弹出窗口来同步这些更改。

然后,您可以使用以下格式将引用导入到单个View

import kotlinx.android.synthetic.main.<layout>.<view-id>

例如,如果您的acitivity_main.xml文件包含ID为textView1TextView ,则可以通过将以下内容添加到Activity来导入对此视图的引用:

import kotlinx.android.synthetic.main.activity_main.textView1

然后,您textView1仅使用ID的ID来访问此活动中的findViewById ,而无需findViewById

让我们看一下实际的扩展,方法是将TextView添加到我们的activity_main.xml文件中,然后将其导入到MainActivity.kt文件中,并使用扩展以编程方式设置TextView的文本。

首先创建您的TextView

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.jessicathornsby.myapplication.MainActivity">

  <TextView
      android:id="@+id/myTextView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
       />

</RelativeLayout>

然后,您可以将TextView导入MainActivity.kt ,并仅使用其ID设置其文本:

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.myTextView

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      myTextView.setText("Hello World")
  }
}

注意,如果要使用同一布局文件中的多个窗口小部件,则可以使用以下公式一次导入一个布局文件的全部内容:

import kotlinx.android.synthetic.main.<layout>.*

例如,如果您要从activity_main.xml文件导入所有小部件,则可以将以下内容添加到Activity中:

kotlinx.android.synthetic.main.activity_main.*.

结论

在第二部分中,我们介绍了如何设置开发环境以支持Kotlin,并探讨了将现有Java代码转换为Kotlin有多么容易。 我们还研究了Kotlin语法的一些主要特征,并将Kotlin Android扩展引入了我们的项目。

翻译自: https://code.tutsplus.com/tutorials/start-developing-android-apps-with-kotlin-part-1--cms-27827