由于android软键盘的弹出或者隐藏每次都会去检查现在的焦点View,所以某些情况下会导致与我们的想法不符.
此方法适用于无法弹出软键盘的状况,目的是跳过InputMethodManager中检查view的状况.
/**
<span style="white-space:pre"> </span> * @param Tool 是我自己封装的反射方法的工具类,不懂反射的同学请百度.
* @param imm InputMethodManager对象
* @param focus 当前焦点view,也可以指定为通过java反射得到InputMethodManager中的mServedView
* @return
*/
public boolean hideInputMethod() {
try {
Object mService = Tool.getField(imm, "mService").get(imm);
Object mClient = Tool.getField(imm, "mClient").get(imm);
Class<?> clientClass = ClassLoader.getSystemClassLoader()
.loadClass("com.android.internal.view.IInputMethodClient");
Method hideSoftInput = Tool.getMethod(mService, "hideSoftInput", clientClass, int.class,
ResultReceiver.class);
return (Boolean) hideSoftInput.invoke(mService, mClient, 2, null);
} catch (Exception e) {
e.printStackTrace();
}
return imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 2);
}
public boolean showInputMethod(View focus) {
try {
Object mService = Tool.getField(imm, "mService").get(imm);
Object mClient = Tool.getField(imm, "mClient").get(imm);
Class<?> clientClass = ClassLoader.getSystemClassLoader()
.loadClass("com.android.internal.view.IInputMethodClient");
Method showSoftInput = Tool.getMethod(mService, "showSoftInput", clientClass, int.class,
ResultReceiver.class);
return (Boolean) showSoftInput.invoke(mService, mClient, 0, null);
} catch (Exception e) {
e.printStackTrace();
}
if (focus == null) {
focus = getWindow().getCurrentFocus();
}
return imm.showSoftInput(focus, 0);
}