属性的都有隐世的set get方法
如果需要在赋值时加入逻辑判断的时候才需要复写
注意,复写时,变量名称要用filed代替,避免递归死循环
空指针安全
在Kotlin里,可以用“?”表示可以为空,也可以用“!!”表示不可以为空。
空指针安全并不是不需要处理空指针,你需要用“?”声明某个变量是允许空指针的,例如:
var num:Int?=null
声明允许为空时,不能使用类型推断,必须声明其数据类型
空指针虽然安全了,但对空指针的处理还是要视情况而定,有时候不处理,有时候做数据检查,有时候还需要抛出异常,这三种情况可以这样写:
val v1 =num?.toInt() //不做处理返回 null 推荐使用这种,减少代码崩溃率,但是尽量不要把变量准许为空,这样,如果哪个地方误传空进去,编译时会有non-null提示
val v2 =num?.toInt() ?:0 //判断为空时返回0
val v3 =num!!.toInt() //抛出空指针异常(用“!!”表示不能为空)
Anko如何跳转:
startActivity(intentFor<FjrWebActivity>(WebConstant.KEY_WEBINFO_URL to "https://www.baidu.com"))
接收参数:
webUrl = intent.extras.getString(WebConstant.KEY_WEBINFO_URL)
lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化技术。
*lateinit 只用于 var,而 lazy 只用于 val
*lateinit不能用在可空的属性上和java的基本类型上
*lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义
*lazy 应用于单例模式(if-null-then-init-else-return),而且当且仅当变量被第一次调用的时候,委托方法才会执行。
*lateinit 则用于只能生命周期流程中进行获取或者初始化的变量,比如 Android 的 onCreate()
例如:空间的findviewByid需要在生命周期中执行的时候
可以提前定义
private val webInfoTitle: WebInfoTitle by lazy {
findViewById<WebInfoTitle>(R.id.webinfo_title)
}
等到在生命周期中时会初始化加执行代码。
Kotlin中很鼓励使用常量语法,增加代码安全性。
kotlin的匿名内部类写法:
test.setListener(this, object : WebCallbackListener{
override fun showButton() {
Log.d("tt", "show button")
}
})
kotlin接口匿名内部类实现写法:
private val client = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
return true
}
}
lambda 匿名内部类:
btn_action2.setOnClickListener { view -> var id:Int = view?.id ?:0 }
目前还没有明白object是什么意思。
java to kotlin语法转换:
类型转换:
java : Activity activity = (Activity)mContext;
kotlin : Activity activity = mContext as Activity
普通的构造方法在kotlin中会优化成
class WebInfoTitle(private val mContext: Context, attrs: AttributeSet) : RelativeLayout(mContext, attrs) {
init{
}
}
方法调用转换:直接用set后面的字段作为对象赋值
setText(CharSequence text) -> text 且变量不准许为null
setVisibility(int visibility) -> visibility