使用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 File/Class:一个普通的Kotlin类,类似普通的Java类
- Kotlin Actiivty:一个Activity类
在创建的工程里第一次使用 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 中都可以使用。
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 和 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 对象,界面也会变成这样:
我们使用 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 Eclipse插件TabHost问题(转载)
- android中实现指针滑动的动态效果
- Unity2019通过unity获取Android动态权限(不用在Android写插件)
- android adb配置环境变量
- Android jni系统变量、函数、接口定义汇总
- Android Studio 的 gradle 插件升级失败