Android Kotlin 学习笔记

作者: EitanLiu | 来源:发表于2016-09-27 11:28 被阅读4270次

    简介

    Kotlin虽说是Java的扩展,能够使用Java类库,但是语法规则完全不同于Java。所以学习Kotlin要么直接忘了Java语法,要么跟Java比较看看区别在哪。经过了一天的折腾我选择先忘掉Java学完Kotlin再比较

    关键字(尽量补全)

    by as lazy init downTo
    声明:open override fun inline inner internal data companion object lateinit var val
    判断:when in is
    运算:and or

    类型

    Any Unit
    基本类型:Boolean Byte Short Int Long Float Double Char

    Android项目中使用Kotlin

    1. 安装Kotlit插件

    Android Studio 默认没有装Kotlin插件File/Setting/Plugins/Install JetBrains plugin搜索Kotlin点击Install安装,Kotlin Extensions For Android已经过时废弃了。接下来只需要简单的配置就可在项目中使用Kotlin和Java同时开发了。

    2. 使用Kotlin

    项目gradle加入编译脚本

    buildscript {
        ext.kotlin_version = '1.0.3'
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.3'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    

    当前工程gradle加入引用

    apply plugin: 'kotlin-android'
    
    //...
    android {
    
        sourceSets {
            //添加一个源码文件夹
            main.java.srcDirs += 'src/main/kotlin'
        }
    }
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
    
        //Kotlin
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
      //...
    }
    
    

    以上操作其实只需要在Tools->Kotlin->Configure Kotlin in Project即可自动配置

    3. 使用Kotlin的Android扩展插件

    kotlin-android-extensions使用这个插件,再需要调用findViewById,XML布局定义的控件,会自动生成引用,对于我们来说现在布局文件就是一个属性

    加入编译脚本(这个版本已经很旧了,版本号自行修改)

    buildscript {
        ext.kotlin_version = '1.0.3'
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.3'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
            
        }
    }
    
    

    加入引用

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    
    //...
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
    
        //Kotlin
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        //...
    }
    
    

    另外还可使用Anko,Anko目的是用代码来代替XML生成布局,加入引用即可

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    
    //...
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
    
        //...
    
        // Anko
        compile 'org.jetbrains.anko:anko-sdk15:0.8.2' // sdk19, sdk21, sdk23 are also available
        compile 'org.jetbrains.anko:anko-support-v4:0.8.2' // In case you need support-v4 bindings
        compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.2' // For appcompat-v7 bindings
    }
    
    

    Kotlin 基本语法

    先说个学习Kotlin语法的小窍门,将代码用Java写好,然后Code/Conver Java File to Kotlin File转换成Kotlin代码,或者将Java代码复制到Kotlin文件会提示转换也是挺方便的,比较差异很容易就能理解了,一开始难免不适应习惯后相信你一定会喜欢上Kotlin

    定义

    忘掉Java的那一套写法不然会很不适应的,Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用val声明,变了用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)。
    常量val延迟加载by lazy{},默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){},变量var延迟加载lateinit

    //常量数组int[][][] arrs = new int[3][2][1];
    val arrs = Array(3) { Array(2) { IntArray(1) } }
    //空安全变量
    var str: String = "hello"
    //可为空字符串变量
    var str1: String? = null
    
    

    条件

    if...else 正常使用,不过移除了switch用更强大的when替代,when子式可以是各种返回Boolean的表达式

    val x = 7
    when (x) {
      in 1..10 -> print("x is in the range")
      in validNumbers -> print("x is valid")
      !in 10..20 -> print("x is outside the range")
      else -> print("none of the above")
    }
    

    循环

    whiledo...while 同Java并无区别,for则有很大改变并多出了几个变种

    val list = ArrayList<String>()
    //递增for (int i = 0; i < list.size(); i++)
    for (i in list.indices) {
       print(list[i])
    }
    //递增for (int i = 2; i < list.size(); i++)
    for (i in 2..list.size-1) {
       print(list[i])
    }
    //递减for (int i = list.size(); i >= 0; i--)
    for (i in list.size downTo 0) {
        print(list[i])
    }
    //操作列表内的对象
    for (item in list) {
        print(item)
    }
    //加强版
    for((i, item) in list.witnIndex()) {
        print(list[i])
        print(item)
    }
    //变种版
    list.forEach {
        print(it)
    }
    
    list.forEach {
        print(it)
    }
    
    list.forEachIndexed { i, s ->
        print(list[i])
        print(s)
    }
    
    list.forEachIndexed(object :(Int,String) -> Unit{
        override fun invoke(i: Int, s: String) {
            print(list[i])
            print(s)
        }
    })
    

    参考资料

    为什么说Kotlin值得一试

    Kotlin: Java 6 废土中的一线希望

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请保留作者及原文链接

    相关文章

      网友评论

      本文标题:Android Kotlin 学习笔记

      本文链接:https://www.haomeiwen.com/subject/rfxbsttx.html