目录

一.Android Studio配置kotlin

    1.安装kotlin插件

    2.添加kotlin依赖

二.使用kotlin语言开发

三.java转kotlin常见错误

四.kotlin语法案例

    1.kotlin中的继承与实现

    2.kotlin中的常量类

    3.kotlin中的静态方法

    4.kotlin中的单例模式

    5.kotlin 中的 !!和?.区别

    6.kotlin 中的when表达式

    7.kotlin 中的Lambda表达式


一.Android Studio配置kotlin

1.安装kotlin插件

File>Settings>Plugins>搜索关键字“kotlin”进行安装>然后重启Androidstudio生效 

 

2.添加kotlin依赖

自动添加kotlin依赖:Tools ->Kotlin->Configure Kotlin in Project

手动添加kotlin依赖:配置build.gradle(android)文件

buildscript {
   ext.kotlin_version = '1.2.60'
   dependencies {
       classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
   }
}

手动添加kotlin依赖:配置build.gradle(app)文件

apply plugin: 'kotlin-android'  // 应用此插件来支持android的开发
apply plugin: 'kotlin-android-extensions'  // 应用此插件可以省去我们频繁的findViewById
dependencies {
   // 添加kotlin依赖
   implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

完成以上配置之后,我们就可以使用kotlin语言来开发我们的应用程序了!

 

二.使用kotlin语言开发

1.新建一个Kotlin File/Class文件,可以在kind中选择你需要新建的文件类型:File、Class、Interface、Enum class 、 Object

2.java语言转kotlin语言开发

在Androidstudio项目中右键选择指定的包或者单个java文件,选择在下方的“Convert Java File To Kotlin File ”选项,可自动将.java文件转成.kt文件;并且复制java文件粘贴到kotlin文件中也可以自动将java代码转成kotlin代码;不过在代码转完之后可能会出现一些错误需要自己手动去解决的。

 

三.java转kotlin常见错误

1.kotlin重写java类的方法时遇到的闪退错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter view

意思是说指定为非null的参数为null了,这个时候我们只需要设置该参数允许为null就可以了,根据错误提示,将“view: View”修改为“view: View?”’即可解决。

 

2.java中用到数组直接转kotlin时遇到的语法错误:

java代码:

public class Test {
       private String title[];
       public Test() {
       title = new String[10];
       }
}

转成kotlin后

class Test {
   private val title: Array<String>
   init {
       title = arrayOfNulls(10)
   }
}

报语法错误“type inference failed / type mismatch” ,大概意思是说类型推断错误,类型不匹配,原因是arrayOfNulls为空数组,它每个元素都默认允许为null,所以变量类型也必须允许为null,在变量类型String后面加上?即可解决:

class Test {
   private val title: Array<String?>
   init {
       title = arrayOfNulls(10)
   }
}

 

四.kotlin语法案例

1.kotlin中的继承与实现

// 导入此包后,可以拿控件ID直接使用“activity_main.xml”布局中的所有控件,无需findViewById
import kotlinx.android.synthetic.main.activity_main.*

// Test类继承AppCompatActivity类,并实现View.OnClickListener接口
class Test : AppCompatActivity(), View.OnClickListener {

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        setContentView(R.layout.activity_main)
        tv_tag.text = "免除findViewById,直接使用控件"
    }

    // 实现View.OnClickListener接口中的onClick方法
    override fun onClick(v: View?) {
    }

}

 2.kotlin中的常量类

object Constants {

    // internal:声明仅同包名下可调用
    internal const val keyDeviceId = "device_id"
    // private:声明仅当前类可调用
    private const val HOST = "https://www.xxx.com"
    // kotlin中字符串使用"$"符号拼接
    const val URL_LOGIN = "$HOST/Api/User/Login?"
    // val:只读 ;var 读写; const:定义常量,只能修饰val
    const val URL_REGISTER = "$HOST/Api/User/Register?"

}

3.kotlin中的静态方法

// 当使用object修饰类名时,那么该类名下的方法都是静态方法
object TestUtil {

    // 不需要传入任何参数
    fun test() {

    }

    // 需要传入一个不为空的字符串
    fun test2(type:String) {

    }

    // 需要传入一个不为空的字符串,并且返回一个整型类型
    fun test3(type:String):Int{
        return 0
    }

}

4.kotlin中的单例模式

class TestInstance {

    // 构造函数
    private constructor() {
    }

    // 伴生对象
    companion object {

        // 定义一个TestInstance对象
        private var INSTANCE: TestInstance? = null

        // 最终返回一个不为null的instance对象
        val instance: TestInstance
            get() {
                if (INSTANCE == null) {
                    INSTANCE = TestInstance()
                }
                return INSTANCE!!
            }
    }
    
}

5.kotlin 中的 !!和?.区别

class Test {

    // 声明一个允许为null的List<String>对象
    private var list: List<String>? = null

    // 测试方法
    fun test() {
        // 使用?.时不会因为list等于null而报空指针,该语句的输出结果会是:“输出list的大小:null”
        System.out.println("list的大小:" + list?.size)
        // 一般这种判断对象是否为空的情况可以结合kotlin内联扩展函数let使用
        list?.let {
            // it代表着传入的list对象,意思是当list对象不为空时执行
            System.out.println("当list不为null时输出集合大小:" + it?.size)
        }

        // 使用!!时会因为list等于null而报空指针,如果list不等于null就没关系
        System.out.println("list的大小:" + list!!.size)
        // 所以当list对象有可能为null时,我们可以加上非空判断
        if (list != null) {
            System.out.println("当list不为null时输出集合大小:" + list!!.size)
        } else {
            System.out.println("当前list对象为null")
        }
        /**
         *  总结:?. 与 !!. 都是Kotlin检测空指针的方法,
         *  ?.当对象为空时,不会抛出空指针异常
         *  !.当对象为空时,会直接抛出空指针异常
         */

    }

}

6.kotlin 中的when表达式

class Test {

    // 测试方法
    fun test(position: Int) {
        // kotlin中的when表达式
        when (position) {
            0 -> {
            }
            1 -> {
            }
            2 -> {
            }
        }
        // java中的if表达式
        if (position == 0) {
        } else if (position == 1) {
        } else if (position == 2) {
        } else {
        }
        // java中的switch表达式
        switch (position) {
            case 0:
            break;
            case 1:
            break;
            case 2:
            break;
            default:
        }
    }

}

7.kotlin 中的Lambda表达式

class Test {

    // 判断该视图是否不为空并且可以点击(Lambda表达式)
    private val isClick = { view: View? -> view != null && view!!.isClickable }

    // 测试方法
    private fun test(view: View?) {
        if (isClick(view)) {
            // 设置按钮点击事件
            view!!.setOnClickListener {
                // 这里的it代表当前传入的view
                Toast.makeText(it.context, "点击了该视图", Toast.LENGTH_LONG).show()
            }
        }
    }
}

 

kotlin参考文献:

http://kotlinlang.org/docs/reference/

https://www.kotlincn.net/docs/reference/