在 Android 里我們是無法直接獲取軟鍵盤高度的,但是在某些場景下,我們又需要獲取軟鍵盤的高度。我們可以使用 ViewTreeObserver.OnGlobalLayoutListener
來監(jiān)聽窗口大小的變化,當(dāng)軟鍵盤彈出時,窗口高度會變小,使用原始窗口高度減去當(dāng)前窗口高度,就可以得出軟鍵盤的高度了。
//記錄原始窗口高度
private int mWindowHeight = 0;
private ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//獲取當(dāng)前窗口實際的可見區(qū)域
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
int height = r.height();
if (mWindowHeight == 0) {
//一般情況下,這是原始的窗口高度
mWindowHeight = height;
} else {
if (mWindowHeight != height) {
//兩次窗口高度相減,就是軟鍵盤高度
int softKeyboardHeight = mWindowHeight - height;
System.out.println("SoftKeyboard height = " + softKeyboardHeight);
}
}
}
};
一般我們在 Activity 的 onCreate()
方法中開始監(jiān)聽:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//......
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
}
請注意當(dāng) Activity 被銷毀的時候,一定要移除監(jiān)聽,否則就會產(chǎn)生內(nèi)存泄漏:
@Override
protected void onDestroy() {
super.onDestroy();
getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(mGlobalLayoutListener);
}
通過以上方法可以實時監(jiān)聽軟鍵盤的高度變化,特別是像有些輸入法例如搜狗,可以隨時切換拼音輸入、手寫輸入,這個時候軟鍵盤的高度都會發(fā)生變化。
除此之外,還可以通過該方法判斷軟鍵盤是否彈出。