比較簡單餐屎,開門見山檀葛。
在andorid中,如果不做處理腹缩,EditText在獲得焦點(diǎn)鍵盤彈起之后屿聋,如果不做處理空扎,則會產(chǎn)生點(diǎn)擊其他部位鍵盤不收起,也可能剛好有其他部分彈出被軟鍵盤遮擋润讥。一般在Activity中統(tǒng)一做處理转锈,這樣不用每次都去處理。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 獲得當(dāng)前得到焦點(diǎn)的View楚殿,一般情況下就是EditText(特殊情況就是軌跡求或者實(shí)體案件會移動焦點(diǎn))
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
hideSoftInput(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
/**
* 根據(jù)EditText所在坐標(biāo)和用戶點(diǎn)擊的坐標(biāo)相對比撮慨,來判斷是否隱藏鍵盤,因?yàn)楫?dāng)用戶點(diǎn)擊EditText時沒必要隱藏
*
* @param v
* @param event
* @return
*/
private boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
+ v.getWidth();
if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) {
// 點(diǎn)擊EditText的事件脆粥,忽略它砌溺。
return false;
} else {
return true;
}
}
// 如果焦點(diǎn)不是EditText則忽略,這個發(fā)生在視圖剛繪制完变隔,第一個焦點(diǎn)不在EditView上规伐,和用戶用軌跡球選擇其他的焦點(diǎn)
return false;
}
/**
* 多種隱藏軟件盤方法的其中一種
*
* @param token
*/
public void hideSoftInput(IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
代碼很簡單,加上注釋一目了然匣缘。
- 另外需要提的就是軟鍵盤的彈起和整個Window會發(fā)生的“化學(xué)反應(yīng)”了猖闪,其實(shí)這個問題麻煩在于采用了沉浸式狀態(tài)欄之后,以下網(wǎng)友博客有介紹肌厨。
1培慌、android全屏/沉浸式狀態(tài)欄下,各種鍵盤擋住輸入框解決辦法
2柑爸、徹底搞定Android開發(fā)中軟鍵盤的常見問題 - 修改軟鍵盤右下角默認(rèn)的回車鍵以及綁定事件看下面吵护。
EditText中imeOptions屬性使用及設(shè)置無效解決