最近用到需要自己写一个输入的界面,这就需要隐藏掉系统默认的输入法弹出来了。
要隐藏输入法,有几种方式:
- 在AndroidManifest中声明Activity的输入模式,详情请看http://blog.csdn.net/u012943767/article/details/48932389
- 在代码中设置
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ideSoftInputFromWindow(view.getWindowToken(), 0);
其中View 为当前获取焦点弹出软件盘的View
上面2中方法只是执行一个就隐藏一次系统的输入法,当EditText获取焦点之后还是会调出来的。但是笔者需要实现的是EditText获取焦点的时候不弹出来,输入的时候也不弹出来,后来发现EditText中有一个方法setShowSoftInputOnFocus
但是该方法是隐藏的。但是该方法实在2.3以后的SDK才出现的,如果要兼容2.3版本,只需要调用:et.setInputType(InputType.TYPE_NULL)
,回到正常情况下,我们需要用到反射来调用setShowSoftInputOnFocus
,代码如下:
Class<EditText> cls = EditText.class;
Method setSoftInputShownOnFocus;
setSoftInputShownOnFocus = cls.getMethod(methodName,boolean.class);
setSoftInputShownOnFocus.setAccessible(true);
setSoftInputShownOnFocus.invoke(et, false);
这样就隐藏了,但是EditText的光标还存在,达到了要求,但是笔者满心欢喜跑在真机上面,并没有效果,键盘还是会弹出来,真机是4.0.4,模拟器是4.1.2 ,后来再查资料,才发现4.0 和4.1.2的SDK中该方法名称改了,4.0-4.1.2是用setSoftInputShownOnFocus
4.1.2之后是用setShowSoftInputOnFocus
这两个方法相当相似。
完整的代码如下:
int currentVersion = android.os.Build.VERSION.SDK_INT;
String methodName = null;
if (currentVersion >= 16) {
// 4.1.2
methodName = "setShowSoftInputOnFocus";
} else if (currentVersion >= 14) {
// 4.0
methodName = "setSoftInputShownOnFocus";
}
if (methodName == null) {
et.setInputType(InputType.TYPE_NULL);
} else {
try {
Class<EditText> cls = EditText.class;
Method setSoftInputShownOnFocus;
setSoftInputShownOnFocus = cls.getMethod(methodName,
boolean.class);
setSoftInputShownOnFocus.setAccessible(true);
setSoftInputShownOnFocus.invoke(et, false);
} catch (Exception e) {
e.printStackTrace();
}
}
最后完美实现了自定义的输入法。