先上個圖:
首先先科普一下,目前軟鍵盤設置大概有那么幾種狀態(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度液,收工厕宗,睡了睡了~