anko小問(wèn)題

最近也在跟風(fēng)學(xué)習(xí)kotlin,用來(lái)寫android覺(jué)得十分好用
本來(lái)用來(lái)布局界面的xml可以用kotlinankoDSL代替,讓人耳目一新啊,再也不用在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里面有ButtonEditText,然后緊接著介紹listener的時(shí)候,接口里面單個(gè)方法用的是button的,多個(gè)接口竟然是SeekBarOnSeekBarChangeListener這個(gè)接口,真是不按常理出牌啊,哎,簡(jiǎn)單的介紹下EditTextTextWatcher接口不好嗎,可能是太簡(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日

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容