Android 官方语言:Kotlin 配置篇
- Android Studio 配置
- 原工程添加 Kotlin 依赖,转成 Kotlin 工程
在看到 I/O 大会上公布 Kotlin 转正的消息之后就知道最近 Kotlin 肯定会很火,所以赶紧写了篇 Kotlin 的初识笔记跟风走了一回。不过要注意的是不能盲目的跟风,跟紧潮流是建立在自己基础踏实的前提下的,慢慢来不要急。
Android Studio 3.0 (Canary 1)
先说简单的,在 Android Studio 3.0 (Canary 1)中适配了 Kotlin,创建新工程时可以选择引入 Kotlin,就省去了自己配置的功夫:
Android Studio 3.0 Canary 1需要注意,无论下载 Canary 版或者下载成功后创建 Kotlin 工程的时候均需懂得科学上网,过程中需要下载一些包。而且遇到问题上 StackOverflow 才是王道。
比如这次创建工程后下载依赖时 gradle 开始报错:
Gradle sync failed: Cause: com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava/util/List;
Consult IDE log for more details (Help | Show Log) (23s 531ms)
Messages 中:
Error:Unable to find method 'com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava/util/List;'. Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-download dependencies and sync project (requires network)
The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem. Stop Gradle build processes (requires restart)
Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
这个过程中我是开着 Shadowsocks 的,一开始还以为是 Gradle 不走 Socks 的问题(以前遇到过),后面跑到 StackOverflow 里看到一个新鲜提出的问题才知道是 Kotlin 依赖的版本有点问题。
Gradle 3.0.0-alpha1 isn't compatible with kotlin-android plugin 1.1.2-3?
解决方法: build.gradle
中依赖的 kotlin 插件版本从 1.1.2-3 改成 1.1.2.4:
这个时候根目录下的整个 build.gradle
文件:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.1.2-4'
repositories {
maven { url 'https://maven.google.com' }
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
还有 app 目录下的 build.gradle
文件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example.chau.myapplication"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
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 "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta5'
compile 'com.android.support:design:25.3.1'
}
如果要在原来的老项目中添加 Kotlin 依赖可以参考到这里的配置。
然后这个时候生成的 MainActivity.kt
长这样:
xml 文件和运行的界面都是最简单的 Hello Word,跟以前是一样的,就不贴图,稍微有区别的就是 debug 的图标:
icon然后在 MainActivity 中尝试一下 Kotlin:
val textView : TextView = findViewById(R.id.main_text) as TextView
textView.text = "HELLO KOTLIN"
成功修改 TextView 的 text 属性,这就是我手写的第一段 Kotlin 代码了。
这时候右键 new ,可以选择 java 或者 Kotlin :
new Kotlin Activity
- Anko 的依赖与简单使用
还有就是引入 Anko 的配置,Anko 是 Kotlin 的一个强大的库,基本上提到 Kotlin 都会用上 Anko,所以也要花时间深入了解一下,这里只是简单的介绍和配置。
Anko 中包括了很多的函数和属性来省去写一些重复的代码,而且还按照功能分成了四个不同的包:
1.Anko Commons:(wiki)
2.Anko Layouts (wiki)
3.Anko SQLite (wiki)
4.Anko Coroutines (wiki)
具体就点进去看好了,从名字上也大概能看出来它们的作用。
在 app 目录的 build.gradle
中:
1.顶部添加 apply plugin: 'kotlin-android-extensions'
2.dependencies
中添加想要引入的模块:
// Anko Commons
compile "org.jetbrains.anko:anko-common:$anko_version"
// Anko Layouts
compile "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// Coroutine listeners for Anko Layouts
//compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
//compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
// Anko SQLite
compile "org.jetbrains.anko:anko-sqlite:$anko_version"
}
然后在 MainActivity
中,我们就可以用控件的 id 获取到控件的实例,并设置控件的属性。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// TextView id 为 main_text
main_text.text = "HELLO KOTLIN"
//上面一句相当于下面的语句
//val textView : TextView = findViewById(R.id.main_text) as TextView
//textView.text = "HELLO KOTLIN"
}
在我们用 id 获取实例的时候,Studio 会自动为我们引入 import 语句。
import kotlinx.android.synthetic.main.activity_main.*
又或者我们可以尝试用 Kotlin 去写布局(Anko-Layout 的功能),在 onCreate
方法中去掉 setContentView
语句,添加 Kotlin 语句:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
verticalLayout {
val textView = textView("HELLO KOTLIN !")
val name = editText("EditText")
button("Button"){
setOnClickListener { toast("OnClick") }
}
}
}
效果:
Kotlin 写出的布局以上就是一些创建 Kotlin 新项目中的配置、简单使用。后面就是在原有的老项目中添加 Kotlin 依赖等的配置和使用。
为原有项目添加 Kotlin 依赖及转换成 Kotlin 工程
上面的 Studio 是 Android Studio 3.0 Canary 1,但是现在项目都还是在 Studio 2.3.2 下运行,所以研究一下2.3.2中 Kotlin 的配置和使用。
- 下载 Kotlin 插件
- 添加依赖
其实安装了插件以后添加依赖就可以靠插件来完成了:
Configure Kotlin in Project然后看根目录和 app 目录下的两个 build.gradle
文件,不出所料和上面 Android Studio 3.0 生成的是一模一样的,这里不重复贴出来。
然后就可以在项目中添加 kt 后缀的文件,写 Kotlin 的代码。
如果想要将原来 的 .java 转化成 .kt 可以用 code -> convert Java File to Kotlin File
但这是一个深坑,自动转化很容易出现无法预料的问题,所以可以用这个功能来参考语法等,但最好不要转化后直接用上。
在原项目中添加 Anko 依赖和上面的流程是一样的,不再赘述。
接下来就是深入了解 Kotlin 的语法,和与此对应的编程思想了,也就是说如果仅仅了解语法是简单的,但是如果不了解如何发挥、利用这些语法糖,反而在失去规范的同时丢掉了清晰的思路则得不偿失。
不知道是否准确表达了自己的想法。共勉。