通過給TextView設置文字可以知道,我們省略了getter,setter,和findviewbyid,本節(jié)繼續(xù)介紹擴展函數(shù).
函數(shù)擴展
一般來說,我們擴展一個類,需要去繼承來實現(xiàn),不過這樣又要寫N多代碼,kotlin能讓你的代碼量大大減少!不信?快來跟我看看!
- 我們再在布局中添加一個Button
我們實現(xiàn)點擊Button彈出一個Toast - java代碼:
Button button = findviewbyid(R.id.button)
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Toast.makeText(this,"hello java",Toast.LENGTH_SHORT);
}
});
- Kotlin代碼:
button.setOnClickListener {toast("hello kotlin")}
經(jīng)過編寫java代碼可以看出,你需要些很多代碼,兒Kotlin只需要一行代碼就可以搞定.
簡單分析
- 去掉findviewbyid
這個在之前的文章中已經(jīng)說明白了這里就不在詳細說明 - 加入點擊事件
對于OnClickListener
接口我們可以用lambda
,Kotlin是完美支持lambda的,這點不用擔心,所以就可以寫成:
button.setOnClickListener {
v:View -> Toast.makeText(this,"hellolambda",Toast.LENGTH_SHORT).show()
}
如果lambda左值參數(shù)沒有用到的話,是可以省略的,所以現(xiàn)在寫成了
button.setOnClickListener {Toast.makeText(this,"hello lambda",Toast.LENGTH_SHORT).show()}
擴展函數(shù)
函數(shù)擴展可以讓你對任意類進行擴展,而不用繼承等等復雜的操作。
舉個栗子!拿Toast來說,到處都可以用到,所以我們新建一個文件夾Extended
,在里面新建一個Extended文件
里面寫上如下代碼:
fun Context.toast(message: String,length: Int = Toast.LENGTH_SHORT) = Toast.makeText(this,message,length).show()
對!沒錯,加了這句話,就可以在所有Context類型中使用toast這個函數(shù)了。
當然相信大家都有疑惑,那萬一不在Context類型里面呢,我想彈出一個Toast怎么辦呢?
大家不必驚慌,kotlin里面提供了包級函數(shù),從此告別工具類
- 首先要獲取一個全局的Context,沒錯就是創(chuàng)建Application子類
class App : Application() {
override fun onCreate() {
super.onCreate()
context = this
}
companion object{
lateinit var context: Context
}
}
- 修改toast函數(shù)
fun toast(message: String, length: Int = Toast.LENGTH_SHORT) = Toast.makeText(App.context,message,length).show()
這樣就可以在任意地方調(diào)用Toast了
擴展變量
- 先定義只能在Context子類能用的變量
val Context.context
get() = this
這樣就可以在Context子類用擴展變量context了
- 當然想在任何地方調(diào)用的話就要定義包級變量
val context
get() = App.mContext //銜接上文中的自定義Application
這樣就可以在用到Context的地方調(diào)用context變量了