1. 程式人生 > >Android軟鍵盤(五)如何判斷軟鍵盤是否顯示

Android軟鍵盤(五)如何判斷軟鍵盤是否顯示

前幾次分析了軟鍵盤自動彈出的現象,以及佈局上移上移等問題,這次記錄一下,如何判斷軟鍵盤是否在顯示。

先來看一下網上比較流行的答案:

一:

if(getWindow().getAttributes().softInputMode == WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE){
    Toast.makeText(Main3Activity.this, "顯示", Toast.LENGTH_SHORT).show();
}else {
    Toast.makeText(Main3Activity.this, "沒顯示", Toast.LENGTH_SHORT).show();
}

經我測試,並沒什麼卵用。
二:
 if(inputMethodManager.isActive(editText)){
    Toast.makeText(Main3Activity.this, "顯示", Toast.LENGTH_SHORT).show();
}else {
    Toast.makeText(Main3Activity.this, "沒顯示", Toast.LENGTH_SHORT).show();
}

經我測試,這個isActive方法,只要editText有焦點,它就返回true....但是我們在第一篇文章就做過測試,並不是EditText獲得焦點,鍵盤就會彈出。
所以這個方法根本不能用來監聽鍵盤是否在顯示。
總結了網上的許多答案,得出結論: 官方並沒有提供與判斷軟體盤是否在顯示的任何相關API。
想要判斷軟鍵盤是否在顯示,總的通過動態計算佈局來解決。
簡單版本的結果演示:
有圖有證據....可以判斷,程式碼如下:
 private boolean isSoftShowing() {
        //獲取當前螢幕內容的高度
        int screenHeight = getWindow().getDecorView().getHeight();
        //獲取View可見區域的bottom
        Rect rect = new Rect();
        getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

        return screenHeight - rect.bottom != 0;
    }

原理:看過原始碼的都知道 我們activity的頂級View是DecorView,獲取到DecorView並取到他的高度:
如圖整個紅色區域就是DecorView,而我們設定的佈局就是藍色區域,標題欄就是綠色區域。
那麼如何判斷鍵盤是否已經彈出呢:
圖片會縮小,右鍵拖動在另一視窗顯示就可以看清楚了。
上圖已經說明清楚,如何來判斷。綠線的Bottom值就是底部到頂部的距離,這個懂的座標系的童鞋應該都知道。
特別提示:
我上面縮寫的5,6行程式碼就可以判斷大多數情況,但是我看到有文字寫出,如果底部有虛擬鍵盤的手機需要再減去
虛擬鍵盤(虛擬導航鍵盤嘛)的高度,如果不減去的話,那麼上述程式碼將會恆大於0,因為虛擬鍵盤的存在相當於一直有一個鍵盤存於彈出狀態。
具體如何得到虛擬鍵盤的高度請看如下程式碼:
      /**
         * 底部虛擬按鍵欄的高度
         * @return
         */
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
        private int getSoftButtonsBarHeight() {
            DisplayMetrics metrics = new DisplayMetrics();
            //這個方法獲取可能不是真實螢幕的高度
            mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int usableHeight = metrics.heightPixels;
            //獲取當前螢幕的真實高度
            mActivity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
            int realHeight = metrics.heightPixels;
            if (realHeight > usableHeight) {
                return realHeight - usableHeight;
            } else {
                return 0;
            }
        }

只要將我的程式碼修改為即可:
screenHeight - rect.bottom - getSoftButtonsBarHeight()!= 0
本文思路以及上述獲取虛擬鍵盤高度的程式碼均收益於此部落格:http://blog.csdn.net/javazejian/article/details/52126391