博客爲 有時個哥 原創,如需轉載請標明出處:https://blog.csdn.net/ls703/article/details/80609869
在公司開發SDK時,有這麼一個需求,要檢測集成我們SDK的應用,是否彈出了輸入軟鍵盤。
因爲不知誰會集成SDK,並且爲了檢測鍵盤的同事不影響客戶的應用開發,最終採取了一下方式進行檢測。
原理就是使用ViewTree檢測窗口布局的變化。
activity.getWindow().getDecorView().getViewTreeObserver()
.addOnGlobalLayoutListener(mLayoutChangeListener);
註冊上上面代碼後,如果佈局變化,則會回調到GlobalLayoutListener mLayoutChangeListener回調中,
回調如下
// 監控窗口布局的變化
class GlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
private Window mWindow;
private boolean isOpen = false;
public void setWindow(Window mWindow) {
this.mWindow = mWindow;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onGlobalLayout() {
// 判斷窗口可見區域大小
Rect r = new Rect();
mWindow.getDecorView().getWindowVisibleDisplayFrame(r);
int screenHeight = mWindow.getWindowManager().getDefaultDisplay().getHeight();
// 如果屏幕高度和Window可見區域高度差值大於整個屏幕高度的1/6,則表示軟鍵盤顯示中,否則軟鍵盤爲隱藏狀態。
int heightDifference = screenHeight - (r.bottom - r.top);
isOpenKeyboard = heightDifference > screenHeight / 6;
if (Boolean.compare(isOpenKeyboard, isOpen) != 0) {
sendSoftInputStatus(isOpenKeyboard);
}
isOpen = isOpenKeyboard;
}
public boolean getImmStatus() {
return isOpen;
}
};
然後判斷顯示區域的比例,如果達到一定的比例,則就可以斷定軟件盤彈出。目前只有軟件盤可能超出如此大的變化。
由於是做SDK,就不知道那個頁面會可能彈出軟鍵盤,所以我們要對每個activity的界面檢測是否有EditView 控件,如果有的話,才註冊ViewTree的監聽,而要判斷每個Activity是否有EditView,同時還需要註冊ActivityLifecycleCallbacks以至於能獲得所有activity。
大體思路就是這樣。
具體代碼示例下載地址:https://github.com/ls0822/CheckSoftInputStatus