Android 隐藏软键盘的方式

最近用到需要自己写一个输入的界面,这就需要隐藏掉系统默认的输入法弹出来了。

要隐藏输入法,有几种方式:

  • 在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 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 cls = EditText.class;
                    Method setSoftInputShownOnFocus;
                    setSoftInputShownOnFocus = cls.getMethod(methodName,
                            boolean.class);
                    setSoftInputShownOnFocus.setAccessible(true);
                    setSoftInputShownOnFocus.invoke(et, false);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

最后完美实现了自定义的输入法。

你可能感兴趣的:(Android,基础核心)