Android 檢測輸入鍵盤是否彈起

博客爲 有時個哥 原創,如需轉載請標明出處: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章