最近的專案過程中有個需求:在一個有輸入框的頁面,展開軟鍵盤時,內容向上平移,但是頂部的actionbar不能跟著一起移動。
一般的解決辦法是通過windowSoftInputMode相關設定就可以完成,參考https://www.cnblogs.com/aswdd/p/6837386.html
但是呢,有的時候這樣也不能完成需求,至於原因,暫時未找到準確的說法,應該就是不同廠商定製產生差異。
於是,可以通過主動調整頁面佈局及獲取軟鍵盤高度來手動調整輸入框不被擋住。具體做法是,滾動部分用ScrollView包裹,當鍵盤彈出時得到頁面中內容高度和輸入框位置以及鍵盤高度,動態調整輸入框滾動到鍵盤以上部分。
其中監聽鍵盤狀態程式碼:
package com.custom;
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
public class SoftKeyBoardListener {
private View rootView;//activity的根檢視
int rootViewVisibleHeight;//紀錄根檢視的顯示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
public SoftKeyBoardListener(Activity activity) {
//獲取activity的根檢視
rootView = activity.getWindow().getDecorView();
//監聽檢視樹中全域性佈局發生改變或者檢視樹中的某個檢視的可視狀態發生改變
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//獲取當前根檢視在螢幕上顯示的大小
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int visibleHeight = r.height();
System.out.println("" + visibleHeight);
if (rootViewVisibleHeight == 0) {
rootViewVisibleHeight = visibleHeight;
return;
}
//根檢視顯示高度沒有變化,可以看作軟鍵盤顯示/隱藏狀態沒有改變
if (rootViewVisibleHeight == visibleHeight) {
return;
}
//根檢視顯示高度變小超過200,可以看作軟鍵盤顯示了
if (rootViewVisibleHeight - visibleHeight > 200) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
}
rootViewVisibleHeight = visibleHeight;
return;
}
//根檢視顯示高度變大超過200,可以看作軟鍵盤隱藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
}
rootViewVisibleHeight = visibleHeight;
return;
}
}
});
}
private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
}
public interface OnSoftKeyBoardChangeListener {
void keyBoardShow(int height);
void keyBoardHide(int height);
}
public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
}
}複製程式碼
當edittextview獲取焦點並彈出鍵盤時,如果ScrollView內容的高度減去edittextview所在位置y軸高度小於鍵盤高度 就設定ScrollView的marginbottom為他們的差,然後滾動ScrollView到edit控制元件位置,如果並沒有小於鍵盤高度,則可直接滾動到對應位置;鍵盤收起時 可設定ScrollView的margin回到原來的值。以此便完成了鍵盤不遮擋輸入框的操作。