【Monica的android学习之路】android项目中如何调用kotlin代码
1.添加kotlin依赖
在安卓项目中新添加kotlin代码非常简单,这为存量安卓项目向kotlin演进提供了很好的条件。
只需要在原有安卓项目中做如下几步设置:
1.root目录build.gradle中设置:
buildscript {
ext.kotlin_version = '1.3.72' //设置版本
repositories {
maven {url 'http://developer.huawei.com/repo/'}
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //添加依赖
}
}
2.app目录build.gradle中设置:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' //添加plugin
..............
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.0.2'
// implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" //添加依赖
}
2.android代码中引用kotlin代码
根据不同的kotlin代码写法,有如下几种不同的调用方式,以下分别进行介绍。
2.1引用kotlin顶层文件(.kt)
顶层类是kotlin中真正的static类,顶层类中的成员全部编译成静态成员。一般用于工具类,静态方法等。
新建顶层类Test.kt:
val name = "monica"
fun func() {
println("monica")
}
在android代码中调用:
import com.monica.myapplication.TestKt;
String name = TestKt.name;
TestKt.func();
2.2 引用class或data class
data calss通常用于保存数据结构
class是普通的kotlin类,两者用法基本相同。
新建kotlin类文件:
class Test {
var TAG = "monica"
fun test() {
println("monica Test")
println("$TAG: "+ getType<Int>())
var tmp = getTime<Int, Boolean>(3, true)
for (entry in tmp) {
println("$TAG: ${entry.key}: ${entry.value}")
}
}
private inline fun <reified T> getType(): Class<T> {
return T::class.java
}
// kotlin特有的泛型用法:
// 1.用inline表示内联函数,在编译时函数体被直接替换,不会发生泛型擦除(即运行时JVM可以识别到T具体表示什么类型)
// 2.用reified将内联函数的泛型实化,因此这里可以用T::class.java直接获取T的类型,还能用a as T等用法
private fun <T, P> getTime(key : T, value : P) : Map<T, P>{
var tmp = HashMap<T, P>()
tmp[key] = value
return tmp
} //通用的泛型方法
}
在android代码中调用:
new Test().test();
2.3引用object
object表示kotlin中的单例类,可以用类名直接调用成员。类似于java中的静态类调用方法,其中的所有成员都必须是单例的。但实际并不是静态的。通常用于常量累、工具类
新建:
object Const {
/** The service bad request. */
const val BAD_REQUEST = 400
}
引用:
Const.BAD_REQUEST
2.4 class中包含object
object相当于class中的一个静态内部类来使用。需要用内部类名才能调用。
新建:
class Test {
object MyObject{
const val CODE = 1
fun a(){
}
}
调用:
Test.MyObject.a();
2.5class中包含companion object
如果想类中一部分成员静态,一部分成员类似于静态,可以用companion object局部定义。
companion object在class Test中定义了一个伴生类MyObject,kotlin保证了Test中始终只包含一个伴生类对象,即单例。
新建:
class Test {
fun b(){
}
companion object MyObject{
const val CODE = 1
fun a(){
}
}
调用:
new Test().b(); //需要实例化对象调用
Test.a(); //直接用类名调用