DialogFragment的返回鍵處理

問題:在使用dialogFragment的時(shí)候?qū)τ诜祷劓I的處理出現(xiàn)一些問題宋税,需求如下:1.如果有鍵盤彈出的時(shí)候點(diǎn)擊返回鍵,鍵盤收起讼油,DialogFragment不關(guān)閉杰赛。

2.如果沒有鍵盤彈出 作出一些操作,并同時(shí)關(guān)閉當(dāng)前DialogFragment和Activity矮台。


如果不對(duì)返回鍵事件進(jìn)行處理乏屯,在點(diǎn)擊返回鍵的時(shí)候首先會(huì)先關(guān)閉當(dāng)前DialogFragment根时,再次點(diǎn)擊才回關(guān)閉Activity。

如果設(shè)置了DialogFragment的setCancelable(false) 是不會(huì)關(guān)閉當(dāng)前的DialogFragment的辰晕,但是返回事件也不會(huì)傳給Activity蛤迎,導(dǎo)致關(guān)閉不掉Activity

這時(shí)候想到要對(duì)返回鍵做出處理,在DialogFragment的onKey中進(jìn)行事件捕獲含友,在onKeyUp的時(shí)候去判斷此次點(diǎn)擊是收起鍵盤替裆,還是要關(guān)閉DialogFragment和Activity。

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

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

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

然而汉形,事情不像想象的那么簡(jiǎn)單纸镊,onKeyUp的調(diào)用 和 從布局里判斷鍵盤的顯示隱藏并不是同步的,所以結(jié)果并不準(zhǔn)確概疆。這種方法被斃掉逗威。。

然后去看keyEvent事件的傳遞岔冀,在翻看WindowPhone的源碼凯旭,發(fā)現(xiàn)在有鍵盤彈出時(shí)候,dispatchKeyEvent會(huì)先處理軟鍵盤使套,并消費(fèi)掉這次事件罐呼。如下圖

所以想到 ,在點(diǎn)擊返回鍵時(shí)候 侦高,如果有鍵盤顯示嫉柴, DialogFragment的onKeyDown由于鍵盤已經(jīng)消費(fèi)掉事件是不會(huì)被調(diào)用的。只有onkeyUp在手指拿起的時(shí)候被調(diào)用 奉呛。

這時(shí)候可以設(shè)置一個(gè)標(biāo)識(shí)來標(biāo)識(shí)是否有鍵盤消費(fèi)了事件计螺。如果在onkeyup時(shí)候判斷標(biāo)志位未被改變 就說明是鍵盤消費(fèi)了事件,就不做出處理瞧壮。如果沒有鍵盤消費(fèi)事件登馒,onKeyDown會(huì)被調(diào)用,標(biāo)識(shí)會(huì)被改變咆槽,就可以繼續(xù)做出操作并關(guān)閉頁面了陈轿。如下圖

好了,到這里看起來是沒什么問題了,然而济欢,事情并沒有想象的那么簡(jiǎn)單赠堵。。

在真機(jī)測(cè)試時(shí)候發(fā)現(xiàn)? 有虛擬按鍵的手機(jī)在點(diǎn)擊返回鍵的時(shí)候會(huì)觸發(fā)一次onKeyDown(少量測(cè)試機(jī)測(cè)試法褥,不一定代表所有手機(jī)茫叭,畢竟android手機(jī)那么多。半等。)揍愁,有物理按鍵的手機(jī)在手指點(diǎn)擊返回鍵的時(shí)候會(huì)多次觸發(fā)onkeydown事件,這樣的話標(biāo)識(shí)是一定會(huì)被改變的杀饵。莽囤。就不能憑借這個(gè)變量來標(biāo)識(shí)是否是鍵盤消費(fèi)了返回事件。

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

最后研究 phonewindow中的dispatchKeyEvent

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

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


final解決方案:

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

第一次寫蛮穿,有點(diǎn)亂糟糟的庶骄,沒看明白的不要吐槽我,有問題或者好的解決方案的可以給予指點(diǎn)践磅。单刁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羔飞,更是在濱河造成了極大的恐慌肺樟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逻淌,死亡現(xiàn)場(chǎng)離奇詭異么伯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卡儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門田柔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骨望,你說我怎么就攤上這事硬爆。” “怎么了擎鸠?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缀磕,是天一觀的道長。 經(jīng)常有香客問我劣光,道長袜蚕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任赎线,我火速辦了婚禮廷没,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垂寥。我一直安慰自己颠黎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布滞项。 她就那樣靜靜地躺著狭归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪文判。 梳的紋絲不亂的頭發(fā)上过椎,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音戏仓,去河邊找鬼疚宇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赏殃,可吹牛的內(nèi)容都是我干的敷待。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼仁热,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼榜揖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤举哟,失蹤者是張志新(化名)和其女友劉穎思劳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妨猩,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜叛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了册赛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠导。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖森瘪,靈堂內(nèi)的尸體忽然破棺而出牡属,到底是詐尸還是另有隱情,我是刑警寧澤扼睬,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布逮栅,位于F島的核電站,受9級(jí)特大地震影響窗宇,放射性物質(zhì)發(fā)生泄漏措伐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一军俊、第九天 我趴在偏房一處隱蔽的房頂上張望侥加。 院中可真熱鬧,春花似錦粪躬、人聲如沸担败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽提前。三九已至,卻和暖如春泳唠,著一層夾襖步出監(jiān)牢的瞬間狈网,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工笨腥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拓哺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓脖母,卻偏偏與公主長得像士鸥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镶奉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程础淤,因...
    小菜c閱讀 6,401評(píng)論 0 17
  • 開發(fā)中需要用到遙控器,各種上下左右菜單音量飛鼠OK按鍵滿天飛...對(duì)于key事件的捕獲僅限于BACK/MENU/H...
    鞋xx閱讀 2,410評(píng)論 2 3
  • 今天是偶們家果果的生日哨苛,還記得2年前的今天鸽凶,是我經(jīng)歷人生飛躍歷史性的一刻,我做了果果的媽媽建峭。 回想起那時(shí)候才只有6...
    何所以暖閱讀 199評(píng)論 0 0
  • 企業(yè)聘用了你亿蒸,作為培訓(xùn)經(jīng)理去擔(dān)任公司內(nèi)部員工培訓(xùn)凑兰,外部客戶培訓(xùn)的學(xué)習(xí)項(xiàng)目負(fù)責(zé)人和公司整合培訓(xùn)體系的建設(shè)者。 你開始...
    許多許多許多多閱讀 415評(píng)論 0 2