Kotlin 能夠對一個類的屬性和方法進行擴展,且不須要繼承或使用 Decorator 模式。 擴展是一種靜態行爲,對被擴展的類代碼自己不會形成任何影響。android
擴展相似是一個設定了使用者的外置裝甲。只要符合使用條件,就能夠使用這種裝甲。git
擴展最直接的好處,代碼少,寫得快github
findViewById(R.id.button).setOnClickListener(v -> doSomeThing();
複製代碼
button.click{
doSomeThing()
}
fun <T : View> T.click(block: (T) -> Unit) = setOnClickListener{
block(it as T)
}
複製代碼
衆所周知,android開發中, view的重複點擊是一個很常見的須要解決的問題。解決方案也不少,rxbindig,從新Listener,listenr中判斷時間間隔。但都有一個缺點,代碼太多啦。上吧,烤特林!bash
/**
* 擴展屬性 延時觸發 即多少時間內重複點擊無反應
*/
private var <T : View> T.triggerDelay: Long
get() = if (getTag(1123461123) != null) getTag(1123461123) as Long else -1
set(value) {
setTag(1123461123, value)
}
/**
* 擴展屬性 上次點擊事件時間
*/
private var <T : View> T.triggerLastTime: Long
get() = if (getTag(1123460103) != null) getTag(1123460103) as Long else 0
set(value) {
setTag(1123460103, value)
}
/**
* 私有擴展方法 計算是否過了延時期
*/
private fun <T : View> T.delayOver(): Boolean {
var flag = false
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - triggerLastTime >= triggerDelay) {
triggerLastTime = currentClickTime
flag = true
}
return flag
}
fun <T : View> T.clickWithTrigger(time: Long = 600, block: (T) -> Unit) {
triggerDelay = time
setOnClickListener {
if (delayOver()) {
block(it as T)
}
}
}
// 使用
button.clickWithTrigger{
doSomeThing()
}
複製代碼
就這樣一行代碼,解決view重複點擊ui
我搜集了一些kotlin經常使用的代碼在裏面,有須要的小夥伴能夠扣一些下來用 github.com/luckyAF/Kom…spa
jumpTo<TestActivity>()
jumpToForResult<TestActivity>(null) { resultCode, data ->
}
複製代碼
data.DEBUG()
複製代碼
data.addTo(arrayList)
複製代碼
總的來講,擴展其實相似於語法糖,挺好用的。假如你們有實用的擴展也能夠交流一下code