【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(); //直接用类名调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值