Android.EditText点击时,隐藏系统弹出的键盘,显示出光标

时间:2021-03-31 08:55:59

因为要用自己创建的虚拟大键盘,所以屏蔽系统的键盘,但是在4.1的测试系统来看,使用editText.setInputType(InputType.TYPE_NULL)方法固然能隐藏键盘,但是光标也会隐藏,所以无法使用。
3.0以下版本可以用editText.setInputType(InputType.TYPE_NULL)来实现。或者设置editText.setKeyListener(null)来实现.
3.0以上版本除了调用隐藏方法:setShowSoftInputOnFocus(false),由于是系统内部方法。无法直接调用所以采用反射的方式来进行调用,如下

Class<EditText> cls = EditText.class;
try {
Method setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
setShowSoftInputOnFocus.setAccessible(false);
setShowSoftInputOnFocus.invoke(mEtInput, false);
catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

 上面反射的方法是从TextView的源码中找到的。因为EditText是继承它的,看网上据说有的sdk里面是"setSoftInputShownOnFocus",反正具体是跟自己的sdk相对应就可以了

if (android.os.Build.VERSION.SDK_INT <= 10) {
                mEtInput.setInputType(InputType.TYPE_NULL);
            } else {
                getWindow().setSoftInputMode(
                        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
                try {
                    Class<EditText> cls = EditText.class;
                    Method setShowSoftInputOnFocus;
                    setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus",
                            boolean.class);
                    setShowSoftInputOnFocus.setAccessible(true);
                    setShowSoftInputOnFocus.invoke(mEtInput, false);
                } catch (Exception e) {
                    e.printStackTrace();
                } 
  }