最近也在跟風學習kotlin
,用來寫android
覺得十分好用
本來用來布局界面的xml可以用kotlin
的anko
的DSL
代替,讓人耳目一新啊蔫敲,再也不用在xml里面掙扎了雖然用xml也挺簡單的
但是在給EditText
上監(jiān)聽的時候(addTextChangeListener
)發(fā)現(xiàn)了一個問題。
一般像java
一樣的寫法烧给,是如此如此這般的
addTextChangedListener(object : TextWatcher{
override fun afterTextChanged(s: Editable?) {
throw UnsupportedOperationException()
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
throw UnsupportedOperationException()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
throw UnsupportedOperationException()
}
})
現(xiàn)在用了anko
燕偶,像這種多個方法的接口,我們不用全部都寫础嫡,想用哪個就寫哪個就行了
textChangedListener {
beforeTextChanged { charSequence, i, i, i -> }
}
注意指么,后面的參數(shù)是IDE自動給我們生成的,像這樣三個i
肯定是通不過編譯的榴鼎,redeclaration伯诬,重復申明的錯誤,只要改成不同的名字就行了巫财。
我發(fā)現(xiàn)的問題是這個方法afterTextChanged { }
盗似,照理來說應該是有個Editable
的參數(shù)的,自動生成的代碼是不帶這個參數(shù)的平项,像我這種重度依賴IDE自動生成代碼的人來說赫舒,少了個參數(shù)你讓我還怎么玩啊這怎么監(jiān)聽在EditText
內容變化之后的內容呢。
于是就是網上找啊找啊闽瓢,Github上的Anko
主頁啊接癌,大家對它的翻譯的文章啊,反正都沒有關于EditText
的這個監(jiān)聽扣讼。缺猛。。奇怪的是椭符,Github上的demo上面明明是一個verticalLayout
里面有Button
和EditText
荔燎,然后緊接著介紹listener
的時候,接口里面單個方法用的是button
的销钝,多個接口竟然是SeekBar
的OnSeekBarChangeListener
這個接口有咨,真是不按常理出牌啊,哎蒸健,簡單的介紹下EditText
的TextWatcher
接口不好嗎座享,可能是太簡單了?難道大家都沒疑惑纵装?還是我太蠢了征讲,也許是吧
沒辦法只能自己搗鼓搗鼓,接著看接口橡娄,這個參數(shù)簽名s:Editable?
嗯诗箍,可能是空的,是不是只有一個參數(shù)挽唉,切可能為空的時候滤祖,它就懶的寫了啊筷狼,要寫自己寫去吧。那我就自己寫吧
afterTextChanged { s: Editable? -> }
就寫成這樣吧匠童,竟然可以了埂材,難道真的是單個參數(shù),可為空的情況下傳不傳參數(shù)都一樣汤求。
查查其他的listener
吧俏险,啊,就是這樣的扬绪。竖独。簡單的onClickListener()
onClick{ }
也是這樣的,當我們需要它的參數(shù)的時候可以自己申明挤牛,或者不寫也沒什么關系莹痢。
2016年4月27日
其實都怪自己沒好好看文檔,仔細閱讀之后墓赴,人家的文檔寫的很清楚:
一個lambda表達式通過參數(shù)的形式被定義在箭頭的左邊(被圓括號包圍)竞膳,然后在箭頭的右邊返回結果值。在這個例子中诫硕,我們接收一個View坦辟,然后返回一個Unit(沒有東西)。所以根據(jù)這種思想痘括,我們可以把前面的代碼簡化成這樣:
view.setOnClickListener({ view -> toast("Click")})
當我們定義了一個方法长窄,我們必須使用大括號包圍滔吠,然后在箭頭的左邊指定參數(shù)纲菌,在箭頭的右邊返回函數(shù)執(zhí)行的結果。如果左邊的參數(shù)沒有使用到疮绷,我們甚至可以省略左邊的參數(shù):
view.setOnClickListener({ toast("Click") })
如果這個函數(shù)的最后一個參數(shù)是一個函數(shù)翰舌,我們可以把這個函數(shù)移動到圓括號外面:
view.setOnClickListener() { toast("Click") }
并且,最后冬骚,如果這個函數(shù)只有一個參數(shù)椅贱,我們可以省略這個圓括號:
view.setOnClickListener { toast("Click") }
2016年5月6日