1. 程式人生 > >輸入框被輸入法遮擋

輸入框被輸入法遮擋

非透明狀態列下使用adjustResize和adjustPan,或是透明狀態列下使用fitsSystemWindows=true屬性

在AndroidManifest.xml對應的Activity裡新增 
android:windowSoftInputMode=”adjustPan”或是android:windowSoftInputMode=”adjustResize”屬性 
這兩種屬性的區別,官方的解釋是: 
這裡寫圖片描述

這兩個屬性作用都是為了調整介面使鍵盤不擋住輸入框 ,我這裡對這兩種屬性使用場景、優缺點、注意事項進行了全方面總結,不知大家平時使用時是否注意到了。

屬性注意事項優缺點失效情況適用情況
adjustResize需要介面本身可調整尺寸
如在佈局新增ScrollView,或輸入控制元件屬於RecycleView/ListView某一項
優點:1.不會把標題欄頂出當前佈局;
2.有多項輸入時,當前輸入框下面的輸入框可上下滑動輸入 
缺點:
1.需要介面本身可調整尺寸;
2. 全屏時失效
1.Activity主視窗尺寸無法調整;
2.Activity全屏
3.android5.0以上通過style設定沉浸式狀態列模式而不設定fitSystemWindow為true
非全屏或是非沉浸式狀態列輸入介面,輸入框比較多
adjustPan頁面不會重新佈局,當前輸入框和鍵盤會直接將當前輸入框以上介面整體向上平移,這樣即使介面包含標題欄,也會被頂上去優點: 使用簡單,不需要介面本身可調整尺寸,不會有失效情況 
缺點:
 會把標題欄頂出當前佈局;有多項輸入時,當前輸入框下面的輸入框無法輸入,必須收起鍵盤顯示輸入框再輸入
有少量輸入項,且輸入量居介面上方
fitsSystemWindows如果多個View設定了fitsSystemWindows=”true”,只有初始的view起作用,都是從第一個設定了fitsSystemWindows的view開始計算padding優點:使用簡單,需要沉浸式狀態列的介面,不需要自己計算padding狀態列的高度 
缺點:
使用有限制
1.View 的其他 padding 值被重新改寫了
2.手機系統版本>=android 4.4
1.介面全屏
2.設定介面主題為沉浸式狀態列
  • adjustResize失效情況:activity設定了全屏屬性指Theme.Light.NotittleBar.Fullscreen(鍵盤彈起時會將標題欄也推上去)或者設定了activity對應的主題中android:windowTranslucentStatus屬性,設定方式為:android:windowTranslucentStatus=true,這時如果對應的頁面上含有輸入框,將會導致點選輸入框時軟鍵盤彈出後鍵盤覆蓋輸入框,導致輸入框看不見。
  • fitsSystemWindows=”true”,只有初始的view起作用:如果在佈局中不是最外層控制元件設定fitsSystemWindows=”true”, 那麼設定的那個控制元件高度會多出一個狀態列高度。若有多個view設定了,因第一個view已經消耗掉insect,其他view設定了也會被系統忽略。http://blog.csdn.net/smileiam/article/details/69055963

加入沉浸式後,頁面底部的輸入框不能被輸入法頂起來 。

通常我們會使用fitsSystemWindows屬性來解決此問題。
  • fitSystemWindows官方描述:
    Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
  • 簡單描述:
    這個屬性的作用是讓view可以根據系統視窗(如status bar)來調整自己的佈局,如果值為true,就會調整view的paingding屬性來給system windows留出空間(即給view新增一個值為狀態列高度的top padding)
網上找了好多資料,都說需要加入android:fitsSystemWindows=”true”,但是在activity的根佈局加入該屬性後,介面複雜的佈局(各種巢狀fragment)也沒有效果。後面看到有人說,只需要把該屬性新增到輸入框所在的根佈局,按這個方法果然解決問題了。