Android-軟鍵盤彈出遮擋布局解決方案

先上個圖:


1.gif

首先先科普一下,目前軟鍵盤設置大概有那么幾種狀態(tài):
1.軟鍵盤彈出時摘符,獲取焦點的輸入框會被頂起痒玩,整個界面往上移動淳附,這種設置

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_PAN);

2.軟鍵盤彈出時议慰,獲取焦點的輸入框被頂起蠢古,整個界面系統(tǒng)自動重新布局(擠壓),這種設置

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_RESIZE);

3.軟鍵盤彈出時别凹,整個界面不會變動草讶,輸入框也不會頂起,這種設置

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_NOTHING);

但是炉菲,這幾種解決方式都滿足不了我的項目需求堕战,我這邊的需求是不僅輸入框要顯示出來,按鈕也要顯示出來(比如登錄拍霜,注冊這些)嘱丢,雖然說完全可以去跟pm講價還價一頓,但是抱著和(song)睦(de)相(yi)處(bi)的想法祠饺,還是嘗試去解決這個問題吧越驻,最后還是征服了,順便封了個庫道偷。

伸手黨直接看這里

github:https://github.com/yoyoyaobin/PreventKeyboardBlockUtil
傻瓜式一鍵配置缀旁,不過目前剛完工,有些細節(jié)還沒補充勺鸦,之后會慢慢迭代并巍,但是核心功能已經(jīng)實現(xiàn)。

那就來說說解決思路吧

一開始腦海里的思路是:

1.設置一個軟鍵盤監(jiān)聽事件换途,監(jiān)聽軟鍵盤的彈出跟關閉
2.設置SOFT_INPUT_ADJUST_PAN的彈出方式
3.當軟鍵盤彈出時懊渡,輸入框被頂起,這時監(jiān)聽事件被觸發(fā)军拟,接下來去獲取按鈕的位置坐標以及軟鍵盤高度
4.最后做最后一公里沖刺剃执,設置布局的margin為:軟鍵盤的Y坐標值減去按鈕Y坐標值,使布局往上移動n像素吻谋,露出按鈕

但是遇到了幾個問題:

1.軟鍵盤監(jiān)聽事件本質(zhì)上是監(jiān)聽布局的變化忠蝗,而當布局變化后坐標已經(jīng)變得不準確,造成的后果就是:算出來的移動的值雖然是對的漓拾,但是系統(tǒng)自作主張的幫你也移動了一部分阁最,并且是沒法獲取到的,所以移動出來的效果不好
2.如果是constraintlayout骇两,給它設置負數(shù)的margin值是無效的
3.布局的方式有很多速种,可能針對你今天這個布局調(diào)出了這個效果,但是換一個布局可能就涼涼了低千,耦合性太強配阵,不方便
4.margin的效果很差馏颂,layout直接刷的一下就彈了過去

最主要還是不準確的問題,因為受系統(tǒng)影響了棋傍,系統(tǒng)彈出軟鍵盤時已經(jīng)幫你移動了一部分救拉,此時你自己的代碼又執(zhí)行了一次移動,直接就多出去了瘫拣,而且這個系統(tǒng)幫移動的距離我至今不知道怎么去獲取亿絮。

后來我修正了一下思路,想設置SOFT_INPUT_ADJUST_NOTHING麸拄,這樣系統(tǒng)就不會去移動我的布局了派昧,我自己來移動就行,結(jié)果發(fā)覺拢切,這樣根本監(jiān)聽不到軟鍵盤的彈出蒂萎,因為布局壓根沒有變化,那鍵盤的高度也就無從而知了淮椰。
皇天不負有心人五慈,就在一整天的翻閱資料文章后,發(fā)現(xiàn)有一個方法可以
參考:https://github.com/siebeprojects/samples-keyboardheight
簡單來講实苞,就是創(chuàng)建一個寬度為0豺撑、高度充滿、彈出鍵盤的popupwindow黔牵,利用addOnGlobalLayoutListener去感知布局變化聪轿,算出鍵盤高度之后回調(diào)出去給外界使用
那,不就ok了猾浦?因為我設置了SOFT_INPUT_ADJUST_NOTHING陆错,系統(tǒng)不會多事幫我移動,我又能獲取到鍵盤高度金赦,接下來就簡單了音瓷,算出需要移動多少才會顯示出按鈕就行了。最后再把margin優(yōu)化成屬性動畫的方式夹抗,把需要移動的布局改為內(nèi)部自己去獲取activity根布局(這樣封裝起來就不用外界傳多一個布局對象了绳慎,同時也解決了margin方案的多種布局造成的不同效果煩惱)

整個流程下來,核心知識點只有三個:

1.系統(tǒng)軟鍵盤設置對應的效果漠烧;
2.ViewTreeObserver的OnGlobalLayoutListener杏愤,監(jiān)聽視圖變化;
3.屬性動畫已脓;

ps:中間我還嘗試使用ConstraintSet解決constraintlayout的移動問題珊楼,有興趣研究的可以自行搜索ConstraintSet。

ok度液,收工厕宗,睡了睡了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画舌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子已慢,更是在濱河造成了極大的恐慌曲聂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇受,死亡現(xiàn)場離奇詭異句葵,居然都是意外死亡,警方通過查閱死者的電腦和手機兢仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剂碴,“玉大人把将,你說我怎么就攤上這事∫涿” “怎么了察蹲?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長催训。 經(jīng)常有香客問我洽议,道長,這世上最難降的妖魔是什么漫拭? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任亚兄,我火速辦了婚禮,結(jié)果婚禮上采驻,老公的妹妹穿的比我還像新娘审胚。我一直安慰自己,他們只是感情好礼旅,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布膳叨。 她就那樣靜靜地躺著,像睡著了一般痘系。 火紅的嫁衣襯著肌膚如雪菲嘴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天汰翠,我揣著相機與錄音龄坪,去河邊找鬼。 笑死奴璃,一個胖子當著我的面吹牛悉默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苟穆,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抄课,長吁一口氣:“原來是場噩夢啊……” “哼唱星!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跟磨,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤间聊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抵拘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哎榴,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年僵蛛,在試婚紗的時候發(fā)現(xiàn)自己被綠了尚蝌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡充尉,死狀恐怖飘言,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驼侠,我是刑警寧澤姿鸿,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站倒源,受9級特大地震影響苛预,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笋熬,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一热某、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧突诬,春花似錦苫拍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔬捷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間周拐,已是汗流浹背铡俐。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妥粟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓勾给,卻偏偏與公主長得像滩报,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脓钾,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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