使用Kotlin开发Android基础介绍

在今年的 Google I/O 大会上宣布 Kotlin 为 Android 开发的第一语言,既然官方都已经选择了它,我们正在学习 Android 的和 Android 开发者们自然就要了解如何使用它。

1、为什么使用Kotlin

Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。

Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制:

  • 兼容性:Kotlin 与 JDK 6 完全兼容,保障了 Kotlin 应用程序可以在较旧的 Android 设备上运行而无任何问题。Kotlin 工具在 Android Studio 中会完全支持,并且兼容 Android 构建系统。
  • 性能:由于非常相似的字节码结构,Kotlin 应用程序的运行速度与 Java 类似。 随着 Kotlin 对内联函数的支持,使用 lambda 表达式的代码通常比用 Java 写的代码运行得更快。
  • 互操作性:Kotlin 可与 Java 进行 100% 的互操作,允许在 Kotlin 应用程序中使用所有现有的 Android 库。这包括注解处理,所以数据绑定和 Dagger 也是一样。
  • 占用:Kotlin 具有非常紧凑的运行时库,可以通过使用 ProGuard 进一步减少。 在实际应用程序中,Kotlin 运行时只增加几百个方法以及 .apk 文件不到 100K 大小。
  • 编译时长:Kotlin 支持高效的增量编译,所以对于清理构建会有额外的开销,增量构建通常与 Java 一样快或者更快。

因为我们这里介绍的是 Kotlin 在 Android 中的使用,所以对 Kotlin 的介绍就不深入了,有兴趣的可以上它的官网查阅更多资料,它的中文社区可以看看。就开始谈 Kotlin 的环境配置。

2、Kotlin的环境配置

现在我们要在 Android Studio 中使用 Kotlin 第一步需要为它添加 Kotlin 的插件,相信大家都对安装插件很熟悉了,打开 setting,选择 plugins,搜索 Kotlin:

我安装了以前的版本,如果你没有安装过 Kotlin 的插件,那显示的就是 install,等一段时间下载好,重启下 Android Studio,我们可以看到:

使用Kotlin开发Android基础介绍_第1张图片

  • Kotlin File/Class:一个普通的Kotlin类,类似普通的Java类
  • Kotlin Actiivty:一个Activity类

在创建的工程里第一次使用 Kotlin,类创建好后会显示“Kotlin not configured”,点击“Configure”,进入Kotlin配置页面。

根据需要选择需要配置的范围,全部模块或单个模块,然后确定。配置完成后会自动在这个工程下的 build.gradle 与 moudle 下的build.gradle下配置相应的参数。

Project 下的 build.gradle:

使用Kotlin开发Android基础介绍_第2张图片

module下的 build.gradle:

使用Kotlin开发Android基础介绍_第3张图片

现在我们就可以在 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开发Android基础介绍_第4张图片

3、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开发Android基础介绍_第5张图片

Kotlin 和 Java 基本语法的不同大都在初始命名上面,熟悉后还是很简便的。

4、anko的简单使用

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 对象,界面也会变成这样:

使用Kotlin开发Android基础介绍_第6张图片

我们使用 Anko 还可以简化 findViewById 的操作:

mTextView = find(R.id.hello)

5、不用findViewById

这里再介绍一个 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。

6、空指针处理

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 中空指针异常得到了很好的解决。

  • 在类型上的处理,即在类型后面加上“?”,即表示这个变量或参数以及返回值可以为 null,否则不允许为变量参数赋值为 null 或者返回 null。
  • 对于一个可能是 null 的变量或者参数,在调用对象方法或者属性之前,需要加上“?”,否则编译无法通过。

看看相同效果的代码用 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基础语法。

结束语:本文仅用来学习记录,参考查阅。

你可能感兴趣的:(Android基础学习,Kotlin,android)