EditText禁止软件盘弹出,且不影响其它功能

前言

昨天一个开发群里有个哥们,问了这样一个问题。想要EditText不弹出软键盘,但是又要支持粘贴,复制剪切功能。最初我想的是直接使用TextView设置textIsSelectable为true。但是没有粘贴的功能。。。。

群友的建议如下:

  • 在EditText外围包一层布局,让外层的布局获取焦点
  • 直接设置Activity无法弹出软键盘
  • 自定义View

自己试验了一下,发现都还是有缺陷,后面想想去找找弹出软件盘的位置,直接禁止掉就好了吧。EditText 继承于TextView。最终我在TextView的onTouchEvent中找到了。

看到这里,各位看官就清楚了吧,我只要让if中的条件(isTextEditable() && mEditor.mShowSoftInputOnFocus && imm != null)其中一个为false。我们也就大功告成了。首先在EditText中没有设置isTextEditalbe的方法,pass掉。接着imm != null 也pass掉。只剩下mEditor.mShowSoftInputOnFocus。点击进去一看。默认的就是true。

只要我们将该值设置成false。不就大功告成了。废话到此为止,上大餐。

public static void setEditTextNoSoftInput(EditText editText) {

    Class editClass = editText.getClass().getSuperclass();
    Class textClass = editClass.getSuperclass();
    try {
        Field editorField = textClass.getDeclaredField("mEditor");
        editorField.setAccessible(true);
        Object editorObject = editorField.get(editText);
        Class editorClass = editorObject.getClass();
        if (!"Editor".equals(editorClass.getSimpleName())) {
            editorClass = editorClass.getSuperclass(); // 防止类似于华为使用的自身的HwEditor
        }
        Field mShowInput = editorClass.getDeclaredField("mShowSoftInputOnFocus");
        mShowInput.setAccessible(true);
        mShowInput.set(editorObject, false);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
复制代码

亲测了小米还有华为手机,可以正常使用,补充一下,华为使用的是自身的HwEditor继承的Editor,所以多拿了一次父类的Class。其它机型自行测试一下。 PS:后面才发现,有其他人已经写过类似的博客,不过自己就当记录也是可以的。有时从源码出发,往往会有意想不到的收获

猜你喜欢

转载自juejin.im/post/5b62aef3e51d45191d7a2c53