在很多情況下,Android自帶對(duì)話框的樣式滿足不了我們項(xiàng)目的需求,這時(shí)候我們可以采用為對(duì)話框設(shè)置自定義布局。如果直接用Dialog可能不會(huì)有什么問題,就是這樣 mDialog = new Dialog(this, R.style.custom_dialog);,然后按部就班(這里的第二個(gè)參數(shù),是我為dialog設(shè)置的一個(gè)主題樣式,主要就是一個(gè)進(jìn)出動(dòng)畫,大家可以無視)。不過如果用AlertDialog就麻煩不斷了,特別是很多人會(huì)遇到自定義布局里的控件明明設(shè)置了監(jiān)聽事件卻沒有效果的問題,這里我根據(jù)自己的總結(jié),來為大家提供一個(gè)解決辦法,如果大家還有其他的解決方案,歡迎交流。

builder.setView(view),不然對(duì)話框直接顯示不了,即使你后面調(diào)用了alertDialog.setContentView(view) 或者是alertDialog.setContentView(R.layout.custom_dialog)。后面的 alertDialog.setContentView(view)這一行代碼在某些情況是不需要加的,因?yàn)槟愕腷uilder已經(jīng)加載了布局了,這里寫了讓大家看一下,后面有講。接下來就是如何找自定義布局里的控件對(duì)象了,首先明確一點(diǎn)就是用this.findViewById是不行的,因?yàn)樵贏ctivity里是找不到你對(duì)話框的控件的,會(huì)報(bào)空指針錯(cuò)誤。接下來我們有很多辦法可以找到控件對(duì)象,比alertDialog.findViewById, window.findViewById,view.findViewById,這里比較關(guān)鍵,首先view.findViewById是可以正確找到控件對(duì)象并且成功設(shè)置監(jiān)聽 。如果你代碼里寫了剛才我說的alertDialog.setContentView(view),那么這樣alertDialog.findViewById和window.findViewById也可以正確找到控件對(duì)象并且成功設(shè)置監(jiān)聽 。
其實(shí)很好理解,只為builder設(shè)置布局的話,相當(dāng)于alertDiglog沒有為其設(shè)置布局文件,所以alertDialog和window怎么可能正確的為控件設(shè)置監(jiān)聽呢。保險(xiǎn)起見,咱們就寫上alertDialog.setContentView(view),那上面三種方式就都可以正確的設(shè)置監(jiān)聽了。
點(diǎn)擊取消對(duì)話框。
到這里就結(jié)束了,這些問題不難,但有可能會(huì)卡住人,說清楚了大家就懂了,源碼什么的也就不需要了,希望能幫到大家。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注