最近也在跟風(fēng)學(xué)習(xí)kotlin
,用來(lái)寫android
覺(jué)得十分好用
本來(lái)用來(lái)布局界面的xml可以用kotlin
的anko
的DSL
代替,讓人耳目一新啊,再也不用在xml里面掙扎了雖然用xml也挺簡(jiǎn)單的
但是在給EditText
上監(jiān)聽的時(shí)候(addTextChangeListener
)發(fā)現(xiàn)了一個(gè)問(wè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
,像這種多個(gè)方法的接口,我們不用全部都寫,想用哪個(gè)就寫哪個(gè)就行了
textChangedListener {
beforeTextChanged { charSequence, i, i, i -> }
}
注意,后面的參數(shù)是IDE自動(dòng)給我們生成的,像這樣三個(gè)i
肯定是通不過(guò)編譯的,redeclaration,重復(fù)申明的錯(cuò)誤,只要改成不同的名字就行了。
我發(fā)現(xiàn)的問(wèn)題是這個(gè)方法afterTextChanged { }
,照理來(lái)說(shuō)應(yīng)該是有個(gè)Editable
的參數(shù)的,自動(dòng)生成的代碼是不帶這個(gè)參數(shù)的,像我這種重度依賴IDE自動(dòng)生成代碼的人來(lái)說(shuō),少了個(gè)參數(shù)你讓我還怎么玩啊這怎么監(jiān)聽在EditText
內(nèi)容變化之后的內(nèi)容呢。
于是就是網(wǎng)上找啊找啊,Github上的Anko
主頁(yè)啊,大家對(duì)它的翻譯的文章啊,反正都沒(méi)有關(guān)于EditText
的這個(gè)監(jiān)聽。。。奇怪的是,Github上的demo上面明明是一個(gè)verticalLayout
里面有Button
和EditText
,然后緊接著介紹listener
的時(shí)候,接口里面單個(gè)方法用的是button
的,多個(gè)接口竟然是SeekBar
的OnSeekBarChangeListener
這個(gè)接口,真是不按常理出牌啊,哎,簡(jiǎn)單的介紹下EditText
的TextWatcher
接口不好嗎,可能是太簡(jiǎn)單了?難道大家都沒(méi)疑惑?還是我太蠢了,也許是吧
沒(méi)辦法只能自己搗鼓搗鼓,接著看接口,這個(gè)參數(shù)簽名s:Editable?
嗯,可能是空的,是不是只有一個(gè)參數(shù),切可能為空的時(shí)候,它就懶的寫了啊,要寫自己寫去吧。那我就自己寫吧
afterTextChanged { s: Editable? -> }
就寫成這樣吧,竟然可以了,難道真的是單個(gè)參數(shù),可為空的情況下傳不傳參數(shù)都一樣。
查查其他的listener
吧,啊,就是這樣的。。簡(jiǎn)單的onClickListener()
onClick{ }
也是這樣的,當(dāng)我們需要它的參數(shù)的時(shí)候可以自己申明,或者不寫也沒(méi)什么關(guān)系。
2016年4月27日
其實(shí)都怪自己沒(méi)好好看文檔,仔細(xì)閱讀之后,人家的文檔寫的很清楚:
一個(gè)lambda表達(dá)式通過(guò)參數(shù)的形式被定義在箭頭的左邊(被圓括號(hào)包圍),然后在箭頭的右邊返回結(jié)果值。在這個(gè)例子中,我們接收一個(gè)View,然后返回一個(gè)Unit(沒(méi)有東西)。所以根據(jù)這種思想,我們可以把前面的代碼簡(jiǎn)化成這樣:
view.setOnClickListener({ view -> toast("Click")})
當(dāng)我們定義了一個(gè)方法,我們必須使用大括號(hào)包圍,然后在箭頭的左邊指定參數(shù),在箭頭的右邊返回函數(shù)執(zhí)行的結(jié)果。如果左邊的參數(shù)沒(méi)有使用到,我們甚至可以省略左邊的參數(shù):
view.setOnClickListener({ toast("Click") })
如果這個(gè)函數(shù)的最后一個(gè)參數(shù)是一個(gè)函數(shù),我們可以把這個(gè)函數(shù)移動(dòng)到圓括號(hào)外面:
view.setOnClickListener() { toast("Click") }
并且,最后,如果這個(gè)函數(shù)只有一個(gè)參數(shù),我們可以省略這個(gè)圓括號(hào):
view.setOnClickListener { toast("Click") }
2016年5月6日