先從需求說起
- 要求一:登錄輸入在頁面最下方,當用戶點擊輸入時废膘,鍵盤彈起,同時將底部所有空間上移慕蔚。
- 盡可能實現(xiàn)沉浸式效果(全屏或者狀態(tài)欄透明)
- 不要遮擋Logo
如果不需要全屏丐黄,使用adjustResize即可
- 寫一個布局,logo是marginTop孔飒,底部是marginBottom灌闺,中間的空間高度大于底部控件的總高度。
- 主題中設(shè)置非全屏也非狀態(tài)欄透明坏瞄。
<activity
android:name=".login.NoFullScreenLoginActivity"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="stateHidden|adjustResize" />
- 其中因為AppTheme系列沒有NoAcionBar主題桂对,需要自己添加
<style name="AppTheme.NoActionBar" parent="AppTheme">
<!-- Customize your theme here. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
- 可以通過設(shè)置背景顏色和colorPrimaryDark相同,可以有類似沉浸式的效果(偽)
全屏狀態(tài)下鸠匀,使用AndroidBug5497Workaround類
- 全網(wǎng)搜索一下蕉斜,大部分都可以指向這個類。因為當主題為FullScreen(或者狀態(tài)欄透明)時缀棍,windowSoftInputMode=adjustResize 會失效宅此。會出現(xiàn)整個布局上移或者有些是完全不上移,此時可以使用使用AndroidBug5497Workaround這個類來實現(xiàn)Resize的效果爬范。
- 缺點:
紅米note2 上的效果
- 部分手機不適配(手上剛好一臺紅米note2父腕,測試不通過,中間會有空白青瀑,而且不是statusbar的高度問題)
- 可能出現(xiàn)誤算璧亮,當界面上有View隱藏或消失時可能觸發(fā)
- 設(shè)置背景不便(鍵盤彈出時會被壓縮)
透明狀態(tài)欄的做法(紅米note2 有效)
- 只是針對上一種做一點點調(diào)整,Theme中不適用FullScreen斥难,而是狀態(tài)欄隱藏枝嘶。狀態(tài)欄隱藏時,resize依然無效蘸炸,但此種狀態(tài)下針對紅米note2使用AndroidBug5497Workaround處理躬络,可以實現(xiàn)上推效果且沒有空白。
<style name="AppTheme.NoActionBar.Immersed" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
-
缺點:除了使用用AndroidBug5497Workaround這個類的缺點外搭儒,windowTranslucentStatus需要v19以上版本才支持穷当。
終極的解決方案(使用PopWindow來獲取鍵盤高度)
事實上,每個人都可以想到淹禾,如果有辦法獲取鍵盤高度馁菜,然后根據(jù)鍵盤高度來調(diào)整底部的空間的margin值就可以實現(xiàn)動態(tài)移動控件的效果。將屏幕固定也有好處铃岔,這樣設(shè)置背景不會因為鍵盤彈出而變形汪疮。但目前的矛盾是要獲取控件高度峭火,需要設(shè)置adjustResize,但全屏下有沖突智嚷,使用AndroidBug5497Workaround有適配問題且存在誤報卖丸,如果不設(shè)置adjustResize,View圖層不會變化盏道,無法獲取鍵盤高度和狀態(tài)
那么稍浆,問題的關(guān)鍵是:能不能在全屏且windowSoftInputMode=adjustNothing(不隨鍵盤移動)的狀態(tài)下,獲取鍵盤高度猜嘱?
答案當然是有衅枫!
不過很奇怪的是,好像國內(nèi)的博客完全沒有文章提到朗伶,這個答案在StackOverflow 也沒有獲得很高的贊(感覺是國外沒有那么復(fù)雜的適配問題弦撩,可能基本上都用AndroidBug5497Workaround解決了),但經(jīng)過測試论皆,確認可以在adjustNothing狀態(tài)下獲取鍵盤高度(這個時候你想怎么樣就怎么樣了)參見:https://github.com/siebeprojects/samples-keyboardheight 以及
https://stackoverflow.com/questions/16788959/is-there-any-way-in-android-to-get-the-height-of-virtual-keyboard-of-device 益楼,Siebe Brouwer 的回答。這個方法其實用的也是ViewTree的觀察模式纯丸,只是套上了一層PopWindow偏形,而且這個PopWindow的寬度是0,高度是match_parent觉鼻,這樣你就感覺不到這一層的存在俊扭。通過PopWindow來獲取鍵盤高度,回調(diào)給Activity坠陈,然后手動計算空間即可萨惑。
補充:如果沒有給底部button設(shè)置背景的話,計算后仍會有一點點空隙仇矾,這是默認背景的問題庸蔼。正常來說使用計算后的鍵盤高度進行marginBottom,底部的按鈕和鍵盤是沒有間隙的贮匕,如果需要增加姐仅,可以給返回后的height適當加一點。
設(shè)置一些圖片背景會導(dǎo)致彈出有點卡頓刻盐,所有方式都是一樣掏膏。暫不確定原因。
對于帶有虛擬導(dǎo)航的手機敦锌,可以考慮使用 android:fitsSystemWindows="true" (resize模式下使用會有問題 跳動)
最后附上Demo地址 SoftKeyboardHeight