DialogFragment的返回鍵處理

問題:在使用dialogFragment的時候對于返回鍵的處理出現(xiàn)一些問題,需求如下:1.如果有鍵盤彈出的時候點擊返回鍵,鍵盤收起,DialogFragment不關閉。

2.如果沒有鍵盤彈出 作出一些操作,并同時關閉當前DialogFragment和Activity。


如果不對返回鍵事件進行處理,在點擊返回鍵的時候首先會先關閉當前DialogFragment,再次點擊才回關閉Activity。

如果設置了DialogFragment的setCancelable(false) 是不會關閉當前的DialogFragment的,但是返回事件也不會傳給Activity,導致關閉不掉Activity

這時候想到要對返回鍵做出處理,在DialogFragment的onKey中進行事件捕獲,在onKeyUp的時候去判斷此次點擊是收起鍵盤,還是要關閉DialogFragment和Activity。

那么問題來了,如何判斷當前軟鍵盤是否在顯示狀態(tài)?返回鍵事件是否被軟鍵盤消費掉了?

首先使用了一種方法? 通過根布局的onLayout來判斷軟鍵盤的顯示和收起,在回調里做出標識,來判斷當前軟鍵盤是否在彈起狀態(tài)。

該方法可參見https://github.com/Jacksgong/JKeyboardPanelSwitch

然而,事情不像想象的那么簡單,onKeyUp的調用 和 從布局里判斷鍵盤的顯示隱藏并不是同步的,所以結果并不準確。這種方法被斃掉。。

然后去看keyEvent事件的傳遞,在翻看WindowPhone的源碼,發(fā)現(xiàn)在有鍵盤彈出時候,dispatchKeyEvent會先處理軟鍵盤,并消費掉這次事件。如下圖

所以想到 ,在點擊返回鍵時候 ,如果有鍵盤顯示, DialogFragment的onKeyDown由于鍵盤已經(jīng)消費掉事件是不會被調用的。只有onkeyUp在手指拿起的時候被調用 。

這時候可以設置一個標識來標識是否有鍵盤消費了事件。如果在onkeyup時候判斷標志位未被改變 就說明是鍵盤消費了事件,就不做出處理。如果沒有鍵盤消費事件,onKeyDown會被調用,標識會被改變,就可以繼續(xù)做出操作并關閉頁面了。如下圖

好了,到這里看起來是沒什么問題了,然而,事情并沒有想象的那么簡單。。

在真機測試時候發(fā)現(xiàn)? 有虛擬按鍵的手機在點擊返回鍵的時候會觸發(fā)一次onKeyDown(少量測試機測試,不一定代表所有手機,畢竟android手機那么多。。),有物理按鍵的手機在手指點擊返回鍵的時候會多次觸發(fā)onkeydown事件,這樣的話標識是一定會被改變的。。就不能憑借這個變量來標識是否是鍵盤消費了返回事件。

好吧,通往成功的路是曲折的。。在就要絕望的時候想起了一句經(jīng)典的話,回家睡一覺,明天早上來看一切都好了。。

最后研究 phonewindow中的dispatchKeyEvent

發(fā)現(xiàn)事件可以拿到事件重復次數(shù)的,如果鍵盤消費了事件 , 在dialogfragment的onkeyDown中獲取的重復次數(shù)是從1開始的。如果沒有鍵盤消費事件,獲取的重復次數(shù)是0。

也就是說 如果在onKeyDown中重復次數(shù)是0就說明返回事件沒有被鍵盤消費掉, 可以認為是這次點擊時是沒有鍵盤顯示的,這時候是可以直接在onKeyUp的時候把事件傳遞給activity進行處理。如下圖:


final解決方案:

在dialogfragment 的onkey里面進行判斷,在onkeydown的時候判斷event.getRepeatCount() == 0? 如果是等于0的時候就說明是沒有處理鍵盤彈出事件,這種情況下 ,activity可以進行操作后直接關閉 。如果等于1 這時候說明是處理了鍵盤彈出事件 ,就不做處理

第一次寫,有點亂糟糟的,沒看明白的不要吐槽我,有問題或者好的解決方案的可以給予指點。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容