问题描述
先说一下问题,一种比较直观的方式来实现EditText控件只读,不可编辑的方式是,在xml文件中设置"editable"参数,这个在控件的attributes中也有,可以勾选,设置editable=false就可以了,但是
正如图片所示,现在editable选项已经deprecated(被弃用)了,IDE建议我们用inputType选项来实现这一功能。之所以被弃用是因为有一种更好的方式来实现这一功能,你已经被警告啦!~意思是说如果之后更新的Android studio取消了这一选项的话,你的代码可能会报错了。
(我实在是不明白为什么editable=false这么简单的方式被弃用掉了~(⊙ˍ⊙)?)
解决方案
一、在代码中设置(推荐)
既然editable被弃用了,我们就不要写了。我们可以在代码中,用EditText控件属性来设置它的只读。只需在MainActivity.java(或其他需要写的代码文件中)写下:
EditText.setKeyListener(null);
此外你需要在content_main.xml中相应的EditText控件处添加属性:
android:textIsSelectable="true"
这句代码可以实现相应的EditText控件只读,他不具备输入任何形式文本的功能了。
下面的txtOutput是笔者的一个Multiline Text控件。
xml文件中加入:
注意
setKeyListener(null)方法会使对文本框的操作全部被否定,也就是说,这样的文本框中的内容无法被复制。但在xml文件中加入的属性textIsSelectable="true"可以解决这一点,使文本可以被全选,复制,粘贴等操作。
如果不加的话,那么就真的只剩下显示功能了。
二、focusable=false
在content_main.xml中,找到要设置的EditText控件,并在属性中添加一行:
android:focusable="false"
像这样
emmmmm,这个方法讲真有点怪,因为它实现的结果,在我的app上,是你可以点击EditText控件,光标也会显示,但是马上光标消失!!可以理解为这行属性使控件不可被聚焦,也就是你刚刚点击,触发了一个聚焦事件,这行属性就把它否决了,反正用起来怪怪的。
这个文本内容同样无法被复制,因为全选操作也是被否定的,他倒是可以粘贴,粘贴的形式跟我们想象的也不一样,比如该文本框原来输出"abc",我们要粘贴"123"的话,理论上我们可以选择粘贴的位置,但由于光标聚焦实现不了了,所以粘贴之后,abc也没了,就剩123了
三、关于inputType
明明Android studio已经建议我们用inputType来实现editable=false这个弃婴了,然鹅,当我们在xml中设置inputType=none时,并没有,什么卵用!我得到的结果,还是和inputType=text时一模一样!
但inputType中还是有很多选择的,这可以定义文本编辑的方式,使用起来非常灵活
(笔者把Build框整没了才把所有的inputType属性截图下来!!w(゚Д゚)w)
我真的试过了inputType=none,没有用,真的没有用。