Window 的 focusable 和 touchable

之前沒(méi)有區(qū)別過(guò) focusable 和 touchable 的關(guān)系拓提,使用 PopupWindow 時(shí)臼闻,發(fā)現(xiàn)對(duì)窗口外的事件響應(yīng)理解不清晰跪帝。

理解 focusable 和 touchable

touchable 就不用多言了,focusable 的作用則需要明確一下些阅。

focus 其實(shí)主要是給“硬件輸入”用的伞剑,比如以前的鍵盤(pán)手機(jī),使用上下左右鍵移動(dòng)時(shí)市埋,被選擇的部分就會(huì)高亮:


User 高亮

如果 View focusable 屬性是 false黎泣,使用鍵盤(pán)(實(shí)體鍵盤(pán))時(shí)就無(wú)法選擇這個(gè) View∷×酰現(xiàn)在手機(jī)很少使用鍵盤(pán)了,但 focusable 依然與日常開(kāi)發(fā)有關(guān)系:not focusable 的 View 不能獲取焦點(diǎn)抒倚,無(wú)法使用鍵盤(pán)(包括實(shí)體鍵盤(pán)和軟鍵盤(pán))輸入內(nèi)容褐着。所以,如果把 EditText 設(shè)置 focusable 為 false托呕,就會(huì)發(fā)現(xiàn) EditText 無(wú)法輸入文字含蓉。

這樣分析下來(lái),touchable 和 focusable 好像沒(méi)什么關(guān)系项郊。這兩個(gè)本質(zhì)確實(shí)沒(méi)什么關(guān)系馅扣,但點(diǎn)擊 EditText 時(shí),EditText 能輸入了着降,說(shuō)明 EditText 在被點(diǎn)擊時(shí)順帶請(qǐng)求獲取了焦點(diǎn)(focusable 為 true)差油。

WindowManager.LayoutParams 的 focusable,touchable

FLAG_NOT_FOCUSABLE:
整個(gè)窗口都無(wú)法獲取焦點(diǎn)任洞,收到的操作(key or other button events)蓄喇,也不能使用鍵盤(pán)打字。焦點(diǎn)的事件都被下層窗口接收交掏。同時(shí)妆偏,自動(dòng)設(shè)置?FLAG_NOT_TOUCH_MODAL 標(biāo)志。

FLAG_NOT_TOUCHABLE:字面意思盅弛,無(wú)法獲取觸摸輸入事件

FLAG_NOT_TOUCH_MODAL:即使?focusable楼眷,也把窗口外的事件傳遞給下層窗口
(這個(gè)即使需要好好理解。not focusable 時(shí)熊尉,默認(rèn)就把窗口外的時(shí)間傳遞給下層窗口了,而 focusable? 且 touchable 時(shí)掌腰,窗口內(nèi)外的事件都會(huì)被當(dāng)前窗口處理狰住。所以,當(dāng)希望窗口 focusable齿梁,窗口內(nèi)事件當(dāng)前窗口處理催植,窗口外事件其他窗口處理時(shí),就需要使用這個(gè)標(biāo)志位)勺择。

FLAG_WATCH_OUTSIDE_TOUCH:只有在設(shè)置了?FLAG_NOT_TOUCH_MODAL 標(biāo)志后创南,該標(biāo)志位才有效。窗口外事件發(fā)送給下層窗口省核,但本層窗口會(huì)收到一個(gè) ACTION_CANCEL稿辙。

FLAG_LOCAL_FOCUS_MODE:用不上,先忽略

FLAG_ALT_FOCUSABLE_IM:對(duì)于輸入法气忠,將?FLAG_NOT_FOCUSABLE 的效果取反邻储。
兩種情況:
1. 設(shè)置?FLAG_NOT_FOCUSABLE 時(shí)赋咽,窗口本來(lái)應(yīng)該無(wú)法輸入內(nèi)容,且位置和布局不隨鍵盤(pán)變化(FLAG_SOFT_ADJUST_* 相關(guān)標(biāo)記位完全失效)吨娜。設(shè)置?FLAG_NOT_FOCUSABLE 后脓匿,位置和布局不隨鍵盤(pán)變化(但依然無(wú)法輸入內(nèi)容,底層窗口可以響應(yīng)事件)宦赠。
2. 沒(méi)有設(shè)置?FLAG_NOT_FOCUSABLE 時(shí)陪毡,本來(lái)應(yīng)該是能夠輸入內(nèi)容,且位置和布局不隨鍵盤(pán)變化(具體變化規(guī)則由 FLAG_SOFT_ADJUST_* 標(biāo)志確定)勾扭。設(shè)置?FLAG_NOT_FOCUSABLE 后毡琉,位置和布局不隨鍵盤(pán)變化,且無(wú)法用鍵盤(pán)輸入內(nèi)容尺借。

PopupWindow 的 focusable绊起,touchable

有了 WindowManager.LayoutParams 基礎(chǔ),就可以分析 PopupWindow 的 focusable燎斩,touchable 了虱歪。

PopupWindow 通過(guò)?setFocusable,setTouchable栅表,setTouchModal笋鄙,setOutsideTouchable 來(lái)關(guān)聯(lián) WindowManager.LayoutParams 的相關(guān)標(biāo)記位。

要注意的是怪瓶,mNotTouchModal 是 private的萧落,并且 setTouchModal 是 @hide 的,所以 mNotTouchModal 由 PopupWindow 內(nèi)部設(shè)置洗贰,應(yīng)用開(kāi)發(fā)中無(wú)法更改 mNotTouchModal找岖。

看 PopupWindow 的?createPopupLayoutParams 方法(使用了 computeFlags 方法)就能知道 PopupWindow 的標(biāo)記位和 WindowManager.LayoutParams 之間的對(duì)應(yīng)關(guān)系:


computeFlags

看文檔中對(duì)?setOutsideTouchable 的描述,為什么只有在 touchable 但 not focusable 狀態(tài)時(shí)能夠生效呢敛滋?

setOutsideTouchable 方法的描述

從 computeFlags 方法中可以看到许布,mOutsideTouchable 對(duì)應(yīng)的就是 FLAG_WATCH_OUTSIDE_TOUCH,前面說(shuō)到绎晃,F(xiàn)LAG_WATCH_OUTSIDE_TOUCH 依賴于 FLAG_NOT_TOUCH_MODAL蜜唾,而 FLAG_NOT_TOUCH_MODAL 又只有在設(shè)置 FLAG_NOT_FOCUSABLE 情況下才算生效,也就對(duì)應(yīng)于 PopupWindow 的 setFocusable(false)庶艾。

Dialog 的 focusable袁余,touchable?

Dialog 內(nèi)部使用 PhoneWindow 創(chuàng)建窗口咱揍,所以可以直接獲取 Window颖榜,修改屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朱转,隨后出現(xiàn)的幾起案子蟹地,更是在濱河造成了極大的恐慌,老刑警劉巖藤为,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怪与,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缅疟,警方通過(guò)查閱死者的電腦和手機(jī)分别,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)存淫,“玉大人耘斩,你說(shuō)我怎么就攤上這事∥ε兀” “怎么了括授?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)岩饼。 經(jīng)常有香客問(wèn)我荚虚,道長(zhǎng),這世上最難降的妖魔是什么籍茧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任版述,我火速辦了婚禮,結(jié)果婚禮上寞冯,老公的妹妹穿的比我還像新娘渴析。我一直安慰自己,他們只是感情好吮龄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布俭茧。 她就那樣靜靜地躺著,像睡著了一般漓帚。 火紅的嫁衣襯著肌膚如雪母债。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天胰默,我揣著相機(jī)與錄音,去河邊找鬼漓踢。 笑死牵署,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喧半。 我是一名探鬼主播奴迅,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了取具?” 一聲冷哼從身側(cè)響起脖隶,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暇检,沒(méi)想到半個(gè)月后产阱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡块仆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年构蹬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悔据。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庄敛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出科汗,到底是詐尸還是另有隱情藻烤,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布头滔,位于F島的核電站怖亭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拙毫。R本人自食惡果不足惜依许,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缀蹄。 院中可真熱鬧峭跳,春花似錦、人聲如沸缺前。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衅码。三九已至拯刁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逝段,已是汗流浹背垛玻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奶躯,地道東北人帚桩。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘹黔,于是被迫代替她去往敵國(guó)和親账嚎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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