【Android 难题室】如何在多个机型,显示隐藏输入法。

Android的开源性,导致多种版本的SDK。
如何有效隐藏显示输入法?
让我们分情境探讨吧

入门: 如何获取输入法服务?

public InputMethodManager getImm() {
    // 初始化输入法界面
    if (imm == null) {
        imm =(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    }
        return imm;
    }

输入法显示隐藏场景:

  1. google 控件editview 自行唤起
  2. 自行唤起

以上场景该如何处理?

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值