Android軟鍵盤(五)如何判斷軟鍵盤是否顯示
阿新 • • 發佈:2019-01-30
前幾次分析了軟鍵盤自動彈出的現象,以及佈局上移上移等問題,這次記錄一下,如何判斷軟鍵盤是否在顯示。
先來看一下網上比較流行的答案:
一:
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