1、一般在Android代码控制软键盘关闭都是像下面这样实现:
public static void hideKeyBoard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
或者这样
public static void hideKeyboard(Activity activity, View v) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive(v)) {
if (activity.getWindow().getDecorView().getWindowToken() != null) {
imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
其实上面两种实现都是大同小异的,不过在大部分手机中,上面两种方法都是可以正常控制软键盘的关闭,后来在美图手机中测试居然没有一丁点效果,根本没法关闭软键盘,美图手机就是个坑爹货,没错就是美图秀秀出的美图手机
2、正常用户点击返回键是可以关闭弹出的软键盘,那么我们是否也可以用代码来模拟返回键操作去控制软键盘的关闭呢?很显然是可以的,但是这样做还需考虑几个问题
- 怎么判断出当前是软键盘弹出状态呢?假如不是键盘弹出状态却调用了返回键操作,那么就会出现关闭当前界面的现象
- 怎么判断本次软键盘的弹出是需要关闭的呢?这个可以在需要关闭软键盘时候,设置一个标志即可
3、至于判断软键盘是否处于弹出状态,系统并没有提供专门的api去判断,不过我们可以通过监听视图树的布局变化来判断软键盘是否弹出
/**
* 处理软键盘显示时,隐藏popupwindow
*/
private int lastHeight = 0;
private boolean needHideKeyBroad = false;
private void handleKeyBroadShow() {
this.mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect frame = new Rect();
mView.getWindowVisibleDisplayFrame(frame);
int curHeight = frame.bottom - frame.top;
//显示软键盘
if (lastHeight - curHeight > 150) {
if (needHideKeyBroad) {
new Thread() {
@Override
public void run() {
Instrumentation instrumentation = new Instrumentation();
instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
needHideKeyBroad = false;
}
}.start();
}else {
//隐藏下拉列表
if (mPopupWindow != null && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
}
}
lastHeight = curHeight;
}
});
}
如上所示,mView是当前界面ContentView,每次监听到视图树的布局有变化时,都会收到系统回调通知,收到通知之后,先获取当前ContentView可见范围,然后跟上一次比对,假如相差大小超过150,那么可以认为是软键盘弹出状态
4、若是判断出本次软键盘的弹出是不合理,那么需要在代码里模拟返回键操作,把本次的软键盘弹出快速关闭
new Thread() {
@Override
public void run() {
Instrumentation instrumentation = new Instrumentation();
instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
}
}.start();
这样的骚操作确实是可以解决软键盘无法代码控制关闭,虽然不算是完美的解决方案,但是也还好吧,起码算是黑暗中的一缕阳光