前言
昨天一个开发群里有个哥们,问了这样一个问题。想要EditText不弹出软键盘,但是又要支持粘贴,复制剪切功能。最初我想的是直接使用TextView设置textIsSelectable为true。但是没有粘贴的功能。。。。
群友的建议如下:
- 在EditText外围包一层布局,让外层的布局获取焦点
- 直接设置Activity无法弹出软键盘
- 自定义View
自己试验了一下,发现都还是有缺陷,后面想想去找找弹出软件盘的位置,直接禁止掉就好了吧。EditText 继承于TextView。最终我在TextView的onTouchEvent中找到了。
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:后面才发现,有其他人已经写过类似的博客,不过自己就当记录也是可以的。有时从源码出发,往往会有意想不到的收获