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:后面才发现,有其他人已经写过类似的博客,不过自己就当记录也是可以的。有时从源码出发,往往会有意想不到的收获

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值