Android的开源性,导致多种版本的SDK。
如何有效隐藏显示输入法?
让我们分情境探讨吧
入门: 如何获取输入法服务?
public InputMethodManager getImm() {
// 初始化输入法界面
if (imm == null) {
imm =(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
}
return imm;
}
输入法显示隐藏场景:
- google 控件editview 自行唤起
- 自行唤起
以上场景该如何处理?
1.google控件editview自行唤起。
最优方案: 强制隐藏
getImm().hideSoftInputFromWindow(rootView.getWindowToken(), InputMethodManager.SHOW_FORCED);
public static final int SHOW_FORCED
表示用户强制打开,关闭输入法(如长按菜单键),一直保持打开直至只有显式关闭。
public static final int SHOW_IMPLICIT
表示隐式打开,关闭输入窗口,非用户直接要求。窗口可能不显示。
2.代码唤起
最优方案:
使用google自带的toggleSoftInput,
多个sdk可以兼容该个方法,
getImm().toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
1.如果上次使用toggleSoftInput打开,使用别的方法隐藏输入法,想再次使用该方法唤醒输入法,该方法有自动内部状态记录器。此时内部状态还是为“打开”,所以输入法仍为隐藏。
2.为何不使用强制唤醒呢?因为强制唤醒的输入法,google没有提供强制隐藏。方法一的强制隐藏仅仅适用于,控件自动唤起的场景
这就有个问题了,有些时候,我们需要隐藏,但是输入法却打开。
有些朋友说使用getimm.isActive(),不就可以了吗?
经过实践。该方法在IMPLICIT属性下,输入法为打开,但隐藏的状态。
所以,最好外部使用全局变量记录一下输入法的打开状态。
最终源码如下:
优秀的解决方案如下
/**
* 打开或隐藏软键盘
* @param mContext
*/
public static void hideOrShowKeyboard(Context context) {
InputMethodManager inputMethodManager=
(InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(
InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 显示软键盘
* @param mContext
* @param view
*/
public static void forceShowKeyboard(Context context) {
if(!InputMethodKeyboardUtils.getInputStatus(getActivity())){//如果是关闭状态才调用
hideOrShowKeyboard(context);
}
setmInputState(InputState.True);//设置当前输入法状态为打开
}
/**
* 强制隐藏软键盘
* @param mContext
* @param view
*/
public static void forceHideKeyboard(Context context) {
//仅针对传进来的的context有效,对于控件自动唤起无效
if(InputMethodKeyboardUtils.getInputStatus(getActivity()){//如果是打开状态才调用
hideOrShowKeyboard(context);
}
//强制关闭,仅仅对控件唤起有效。
InputMethodManager imm =
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(
view.getWindowToken(),InputMethodManager.SHOW_FORCED);
setmInputState(InputState.False);//设置当前输入法状态为关闭
}
/**
* 获取输入法状态
* @param mContext
* @return
*/
public static boolean getInputStatus(Context context) {
//初始化输入法,当前根据当前APP输入法状态
if(mInputState == InputState.Null){
InputMethodManager imm =
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
mInputState = imm.isActive()?InputState.True:InputState.False;
}
return mInputState == InputState.True; // 若返回true,则表示输入法打开
}
//输入法状态枚举类
public enum InputState{
Null,True,False;
}
private static InputState mInputState = InputState.Null;
public static void setmInputState(InputState mInputState) {
InputMethodKeyboardUtils.mInputState = mInputState;
}
}