简化代码和Kotlin的特性-Kotlin在Android中的使用(二)

2023-05-16

文章目录

  • 一、使用Kotlin来简化findViewById代码
  • 二、Kotlin特性
    • 1.不需要“;”结尾
    • 2.“:”的使用
    • 3.没有“new”关键字
    • 4.变量,常量定义,类型推断
    • 5.空指针安全
    • 6.函数定义
    • 7.类检测及自动转换
    • 8.in、区间和集合
    • 9.用when取代了switch
    • 10.单例模式
    • 11.类的结构
    • 12.构造函数
    • 13.模块初始化
  • 三、总结

一、使用Kotlin来简化findViewById代码

在Android的代码中,一个Activity和xml布局是一个引用关系,Activity中使用界面中的元素必须先用findViewById找到这个元素

在Kotlin中也可以继续通过findViewById来绑定界面控件,同时还可以通过在gradule中引用applyplugin:'kotlin-android-extensions’来跳过findViewById这个函数直接使用控件,实现步骤如下:

在app的gradule中,添加引用
添加引用
通过布局中的控件id直接使用,这里给TextView赋值为例:
使用
通过按住Ctrl+鼠标焦点,可以看到这个控件id属于哪个xml布局,并可点击跳转。
Kotlin通过遍历xml创建临时的虚拟包来实现引用,在编译APK时,会自动补充findViewById代码,最终生成的内容是一样的,但可以减少开发时findViewById的代码量。

二、Kotlin特性

1.不需要“;”结尾

在Kotlin语法里,代码行不需要用“;”结尾,代码结束不需要符号

2.“:”的使用

在Java里,“:”主要在运算符里出现(for/switch/三元运算符等)。
在Kotlin语法里“:”的作用比较广泛
(一) 定义变量类型

var name:String="my name" //变量name为String类型

(二) 定义参数类型

fun setID(id:Int){ //参数id为Int类型
}

(三) 定义函数的返回值

fun getAddr(id:Int):String{ //返回值为String类型
}

(四) 声明类/接口的继承

class KotlinActivityUI :AnkoComponent<KotlinActivity>{//继承AnkoComponent接口
}

(五) 使用Java类

startActivity(Intent(this,KotlinActivity::class.java))//需要用::来使用Java类

3.没有“new”关键字

Kotlin实例化一个对象时不需要new关键字

var list: List<String> = ArrayList()
val cat = cat()

4.变量,常量定义,类型推断

用var定义变量

var name:String="my name"

用val定义常量

val TAG:String="ClassName"

定义可省略数据类型,Kotlin会自动推断数据类型

var name="my name"
val TAG="ClassName"

5.空指针安全

空指针安全并不是不需要处理空指针,在Kotlin里,可以用“?”表示可以为空,也可以用“!!”表示不可以为空。

 var num:Int?=null

空指针的处理情况,不处理,数据检查,抛出异常:

val v1 = num?.toInt() //不做处理返回 null
val v2 = num?.toInt() ?:0 //判断为空时返回0
val v3 = num!!.toInt() //抛出空指针异常(用“!!”表示不能为空)

6.函数定义

函数定义使用关键字 fun,参数格式为:参数 : 类型

fun sum(a: Int, b: Int): Int {   // Int 参数,返回值 Int
    return a + b
}

表达式作为函数体,返回类型自动推断,用“=”代替return:

public fun sum(a: Int, b: Int): Int = a + b   // public 方法则必须明确写出返回类型

无返回值可以写Unit 或者不写,相当于java的void

fun printSum(a: Int, b: Int): Unit { 
    print(a + b)
}

// 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
public fun printSum(a: Int, b: Int) { 
    print(a + b)
}

函数的允许空指针安全

fun getAddress(id:Int,name:String) :String?="got it"

7.类检测及自动转换

使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // 做过类型判断以后,obj会被系统自动转换为String类型
    return obj.length 
  }
fun getStringLength(obj: Any): Int? {
  // 在 `&&` 运算符的右侧, `obj` 的类型会被自动转换为 `String`
  if (obj is String && obj.length > 0)
    return obj.length
  return null
}

8.in、区间和集合

区间是为任何可比较类型定义的,用in判断数字是否在某个区间

if(x in 1..5){ ...//检查x数值是否在1到5区间

用in判断集合中是否存在某个元素

if(name in list){...//检查list中是否有某个元素

用in遍历整个集合

for (i in 1..4) print(i) // 输出“1234”

for (i in 4..1) print(i) // 什么都不输出

if (i in 1..10) { // 等同于 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步长
for (i in 1..4 step 2) print(i) // 输出“13”

for (i in 4 downTo 1 step 2) print(i) // 输出“42”


// 使用 until 函数排除结束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}

在遍历集合时,可以从第N项开始遍历

for(i in 3..list.size-2){...相当于for (int i = 3; i <= list.size()-2; i++)

倒序遍历

for(i in list.size downTo 0) {...相当于for (int i = list.size(); i >= 0; i--)

9.用when取代了switch

    fun doWhen(obj:Any){
        when(obj){
            1 -> "is Int"
            in 1..5 -> "between 1-5"
            "str" -> test(obj.toString())
            is dog -> "is a dog object"
            else -> "default"
        }
    }

代码中的参数类型Any,相当于Java中的Obejct,是Kotlin中所有类的基类

10.单例模式

在Kotlin中,直接从语言提供了单例,关键字为object,如果在androidstudio等IDE中支持了Kotlin,直接输入singleton会自动生成单例的伴随对象:

    object SingTest {
        val name = "Daipi"
    }

11.类的结构

java中Object是所有类的基类,而在Kotlin中Any是所有类的基类

Kotlin中object(小写)代表单例类

Kotlin中没有new关键字

private: 仍然表示私有

protected: 类似private,在子类中也可见

internal: 模块内可见

inner:内部类

public: 仍然表示共有,但是Kotlin的内部类和参数默认为public,一般可以不写

abstract:仍然表示抽象类

interface:仍然表示接口

final关键字取消, Kotlin中的类默认不能继承,通过open关键字修饰后才可继承

static关键字取消,用compaion object的概念替换使用,伴随对象作为单例的实体,能继承扩展,比static更加灵活

java中使用implementextend来实现接口和继承类,在Kotlin中统一使用“”,继承类时后面需要**(),中间用“,**”区分

class BaseClass : Activity(), IBinder{ //示例

12.构造函数

java中构造函数一般通过下面的方式并列重载

public className (参数) {...}
public className (参数1,参数2) {...}

在kotlin中,类也可以有多个构造函数,分为一个主构造函数和多个二级构造函数,主构造函数一般直接写在类名后面

class dog (srt:String){...}

二级构造函数必须代理主构造函数

class dog (val name:String){
    constructor(name: String,qq: Int):this(name){

    }
}

13.模块初始化

类初始化时会执行init修饰的**{}**里面的代码

class dog (val name:String){
    constructor(name: String,qq: Int):this(name){

    }
    init {
        var qq = 123456
        var myname = name
    }
}

三、总结

以上是一部分kotlin语言的基础特性,更多详细的基础内容可仔细阅读官方文档
或在Kotlin教程中学习

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简化代码和Kotlin的特性-Kotlin在Android中的使用(二) 的相关文章

随机推荐