目录
一.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/