使EditText只读

133
我想创建一个只读的EditText视图。实现这个功能的XML代码似乎是android:editable="false",但我想在代码中实现它。
我该如何做?

请查看以下链接:http://developer.android.com/reference/android/widget/TextView.html#attr_android:editable - ReNa
4
值得注意的是,android:editable 对于 EditText 已经被弃用。 - Derek W
1
最可靠的方法是使用来自此库UI.setReadOnly(myEditText, true)。有一些必须设置的属性,您可以在源代码中查看。 - caw
3
是的,Derek是正确的。现在在XML中,您应该使用android:inputType="none"android:textIsSelectable="true" - Atul
24个回答

144

请使用以下代码。

Edittext.setEnabled(false);

42
这将不仅使内容只读,而且还会禁用滚动和复制 :-( - josef
3
这会禁用多行EditText等控件,因此无用。 - Atul
尝试过这个但是失去了值吗? - fdurmus77

106
如果你使用setEnabled(false),那么你的editText看起来会被禁用(变灰等)。你可能不想改变编辑器的视觉效果。
一种较少侵入性的方法是使用setFocusable(false)
我相信这更接近你最初的意图。

9
可以,但用户仍然可以在文本框中“粘贴”。 - xtrem
15
这对我很有效。我需要它可点击,所以我不能使用setEnabled(false)。为了解决可粘贴问题,我只需将android:longClickable="false"添加进去即可。 - dt0
3
如果您使用setFocusable(false)(甚至使用setClickable(false)setFocusableInTouchMode(false)),您仍然可以通过长按您的editText并选择Paste选项(除非系统剪贴板为空),来更改您的editText的值,长按时间为几百毫秒,具体时间可以查看ViewConfiguration.getLongPressTimeout()方法。我在最新可用的API 23(Marshmallow)上进行了测试。 - patryk.beza
这个有效,我能够滚动而不看到光标。 - live-love

31

XML 中使用:

android:editable="false"

例如:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />

根据Javadoceditable属性似乎并未被弃用(至少在API级别23中没有)。 - Greg Brown
9
@MichelJung是正确的,你需要使用android:inputType="none" - Ata Iravani
2
问题是寻找一种通过Java代码而非XML使可编辑性为false的方法! - saeed khalafinejad
9
我尝试使用 android:inputType="none",但数据仍然可以编辑。 - BlueMonkMN
8
谷歌再次将最简单的事情推向了无法想象的高度。 - Chuck

24

这对我有用:

EditText.setKeyListener(null);

5
这本来不错,但用户仍然可以在该字段中“粘贴”。无论如何还是要点赞,尽管这看起来像是一个技巧。我希望它们有一个 setEditable() 的 API。 - xtrem

22
editText.setInputType(InputType.TYPE_NULL);

根据文档,此选项可防止软键盘显示,同时也禁止粘贴,允许滚动并且不会改变视图的外观。但是,这也会防止在视图中选择和复制文本。

从我的测试来看,将setInputType设置为TYPE_NULL在功能上相当于已弃用的android:editable="false"。另外,android:inputType="none"似乎没有明显的效果。


同意,暂时这个方法可行,就像你所说的android:inputType="none"不再起作用了。 - Goke Obasa
1
不幸的是,这并不能防止在虚拟键盘已经打开的情况下输入到字段中(即用户先点击可编辑字段,然后点击此字段 - 虚拟键盘不会关闭)。而且它也不能防止从外部键盘输入到该字段。 - jk7

19
android:editable="false"已被弃用,因此您不能使用它使编辑文本只读。
我已经使用以下解决方案完成了此操作。在这里,我已经使用: android:inputType="none" android:textIsSelectable="true" android:focusable="false" 试试吧 :)
<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>

它并不是真正的只读,您仍然可以将值粘贴到此代码中的EditText以进行编辑。android:enabled="false"可能是一个好的替代方案。 - Elif
添加 android:longClickable="false" 将防止粘贴。 - Matthew

16

最好使用TextView代替。


10
根据他的应用程序流程,有时需要使其可编辑,而其他情况则不需要。 - Muhammed Refaat

8
editText.setEnabled(false);
editText.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence src, int start, int end,
            Spanned dst, int dstart, int dend) {
        return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
    }
} });

这将为您提供不可编辑的EditText过滤器。您需要先在editText字段上放置要输入的文本,然后应用此过滤器。


2
一个好的解决方案,比TextWatcher少了很多代码。这允许用户选择和复制文本,但不能通过键入或剪切粘贴来更改文本。返回语句可以简化为return dst.subSequence(dstart, dend); - jk7
我的上一个评论是指仅针对setFilters()语句,而不是禁用EditText字段。 - jk7
谢谢,这是唯一对我有效的解决方案!令人沮丧的是,某些有效的东西被弃用,并被一些(inputType="none")仍然不起作用的东西所取代,并带有不需要的副作用(多行输入)。请注意@jk7建议的更改非常重要,因为使用原始返回语句,如果您选择了原始文本的一部分并键入了内容,则会用过滤器返回的空字符串替换所选文本。在这种情况下,src长度不为零,而空字符串正在产生影响。 - Paul L

6
写下这两行文字就足以完成你的工作了。
yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);

将监听器设置为null比禁用它更有帮助。 - Humberto Castañeda

5

在XML中设置

android:inputType="none" 

1
我已经尝试过这个,结果仍然可以被编辑。 - BlueMonkMN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接