前言
我們都知道在 Android 上軟鍵盤彈出會使我們的窗口高度被壓縮,這時我們可能就要通知界面做出調(diào)整以適應(yīng)新的高度。
網(wǎng)上有很多監(jiān)聽軟鍵盤彈出的方法,但大多用法過于復(fù)雜或存在缺陷,因此今天我們來聊聊如何簡單的監(jiān)聽軟鍵盤彈出并獲取軟鍵盤高度。
思路
上面已經(jīng)提到了,軟鍵盤彈出后 APP 窗口的高度會發(fā)生改變,而高度改變必然會導(dǎo)致 View 的 onSizeChanged 方法被調(diào)用,因此我們可以從這里下手。
我們可以自定義一個 View 繼承自 FrameLayout,作為我們要監(jiān)聽軟鍵盤彈出的界面的容器,然后復(fù)寫 onSizeChanged 方法。根據(jù)新舊高度來判斷鍵盤是否彈出。
這里還有一個問題,并不是只有軟鍵盤彈出或隱藏會引起窗口高度改變,在一些支持隱藏導(dǎo)航欄(虛擬按鍵)的手機(jī)(比如很多華為手機(jī))上,隱藏或彈出導(dǎo)航欄同樣會引起窗口高度改變,我們也要加以判斷。
由于沒有能夠百分百準(zhǔn)確獲取導(dǎo)航欄高度的辦法,因此我們認(rèn)為鍵盤最小高度為屏幕高度的1/4,小于這個高度的就不認(rèn)為是鍵盤彈出或隱藏。
實(shí)現(xiàn)
public class ResizeFrameLayout extends FrameLayout {
private KeyboardListener mListener;
private int minKeyboardHeight;
public interface KeyboardListener {
void onKeyboardShown(int height);
void onKeyboardHidden(int height);
}
public ResizeFrameLayout(Context context) {
super(context);
}
public ResizeFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ResizeFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setKeyboardListener(KeyboardListener listener) {
mListener = listener;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// 認(rèn)為鍵盤最小高度為屏幕的1/4
DisplayMetrics dm = getResources().getDisplayMetrics();
minKeyboardHeight = dm.heightPixels / 4;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (h == 0 || oldh == 0) {
return;
}
if (oldh - h > minKeyboardHeight) {
notifyKeyboardEvent(true, oldh - h);
} else if (h - oldh > minKeyboardHeight) {
notifyKeyboardEvent(false, h - oldh);
}
}
private void notifyKeyboardEvent(boolean show, int keyboardHeight) {
if (mListener == null) {
return;
}
if (show) {
mListener.onKeyboardShown(keyboardHeight);
} else {
mListener.onKeyboardHidden(keyboardHeight);
}
}
}
使用
將該 View 作為需要監(jiān)聽軟鍵盤彈出隱藏的界面的容器,然后對該 View 添加監(jiān)聽器即可。