在一个项目中我需要一个EditText获取到焦点,同时自动打开软键盘,需要使用方法:
private InputMethodManager imm;
imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(password_et, InputMethodManager.SHOW_FORCED);
有的打开了但是不按返回键不能自动关上,比如使用参数InputMethodManager.SHOW_FORCED,有的干脆打不开,比如使用参数InputMethodManager.SHOW_IMPLICIT,就不会自动弹出键盘。
为了解决不能自动隐藏软键盘的问题,我找了很多资料,最后发现,如果成对使用:
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
就可以代码实现隐藏软键盘。
也就是说:我在需要打开软键盘时用:
private InputMethodManager imm;
imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(password_et, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
在关闭软键盘时,我需要再次调用
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
这样软键盘就隐藏了。
然后我的项目中让用户输入密码,当密码错误的时候会用Toast来提示用户,然后把EditText内容清空,当显示Toast的时候软键盘会自动关上,因为清空内容后用户还要输入,所以我需要再次打开软键盘。
这时我又调用了一次
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);发现软键盘并不能按照想象的打开。
考虑到隐藏软键盘也用这个方法,是不是Toast后调用的这一次是隐藏软键盘呢?虽然Toast让软键盘强制隐藏了,但是代码里面并没有跟打开软键盘时调用的这个方法成对的隐藏方法,所以这一次的调用是为了隐藏。
于是我把这个方法复制了一行,即隐藏时调用两次这个方法:
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
发现软键盘被打开了。证明我想的是对的, 由于其他原因(只要不是代码原因)隐藏的软键盘,再次打开时必须调用两次该方法:
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);