Android中禁用EditText

243
在我的应用程序中,我有一个EditText,用户仅具有读取访问权限而不是写入访问权限。
在代码中,我设置了android:enabled="false"
虽然EditText的背景变暗,但当我单击它时,键盘弹出并且我可以更改文本。
要禁用EditText,应该设置什么?

3
可以保留视图的样式和滚动行为。如果想要在保留这些属性的同时禁用一个 EditText,只需要从 这个库 中使用 UI.setReadOnly(myEditText, true)。如果想要在没有该库的情况下复制此操作,请查看 此小方法的源代码 - caw
28个回答

283

我认为正确的做法是设置android:editable="false"

如果你想知道为什么我的链接指向TextView的属性,答案是因为EditText继承自TextView

EditText只是在TextView上覆盖了一层外壳,并将其配置为可编辑。

更新:
如下方评论所述,editable已被弃用(自API级别3)。您应该改用inputType(值为none)。


22
android:editable已被弃用。应使用android:inputType="none"代替,但它存在漏洞并且不起作用。如果我们都在这里点赞这个问题:http://code.google.com/p/android/issues/detail?id=2854,那就太好了。 - Viktor Brešan
97
editText.setEnabled(false); 的意思是禁用文本编辑框,而 editText.setInputType(InputType.TYPE_NULL); 的意思是使文本编辑框无法输入任何文字。 - Asymptote
1
@ViktorBrešan 当我有多行EditText并设置android:inputType="none"时,它会将其更改为单行。禁用多行EditText但让用户阅读整个文本是一件麻烦的事情。 - Adil Malik
33
android:editable="false" android:focusable="false" 对我很管用(忽略它被废弃的事实,我认为android:editable与android:inputType无关)。 - Muhammad Babar
17
对于所有android:inputType="none"无效的人,请尝试以下方法:将android:inputType="none"与android:focusable="false"一起使用。 - Surendra Kumar
显示剩余4条评论

187

使用EditText.setFocusable(false)可以禁用编辑功能;
使用EditText.setFocusableInTouchMode(true)可以启用编辑功能。


1
它可以工作,但这不是一个好的实践,因为视图看起来像可编辑的,但实际上不行。对我来说效果很好,因为我的视图有自定义背景,所以加一分。 - kaneda
5
@kaneda。我实际上更喜欢这个。我不想让我的框变灰。 :) - IAmGroot
1
在Android 4.4中,此选项将保持原始文本颜色。使用editText.setEnabled(false);将更改文本颜色为灰色。然而,当使用setEnabled时,下拉框不会更改文本颜色,这使得体验不一致。 - tbraun
为什么不使用 setFocusable(true)?请查看此链接以了解 setFocusable()setFocusableInTouchMode() 之间的区别: https://dev59.com/WGAg5IYBdhLWcg3wQ5El - kenju
但是您仍然可以在EditText视图上制作长选项卡,并从剪贴板粘贴文本。 - user924
显示剩余2条评论

78

您可以尝试以下方法:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

启用的EditText:

Enabled EditText

禁用的EditText:

Disabled EditText

对我有用,希望能帮到您。


1
这看起来像是一个TextView。太棒了,这正是我在寻找的东西。 - Yunus Haznedar
9
如果有人遇到启用后退按钮的问题,需要调用editText.setFocusableInTouchMode(true)而不是editText.setFocusable(true) - Dart Dega

72

使用此功能禁用用户输入

android:focusable="false"

android:editable="false"这个方法已经被弃用了。


2
这应该是被接受的答案。将输入类型设置为“none”,如其他答案中所建议的那样,不总是有效。将“enabled”设置为“false”可以防止编辑,但也会使文本变暗,这可能或可能不是所需的。 - user3386180

55

禁用 EditText,我认为我们可以使用 focusableenable 但是:

  1. 使用 android:enabled=...editText.setEnabled(...)

    它还会将 EditText 中的文本颜色更改为灰色。
    点击时没有任何效果。

  2. 使用 android:focusable=...editText.setFocusable(false) - editText.setFocusableInTouchMode(true)

    它不会更改 EditText 的文本颜色。
    当被点击时,它会高亮显示 EditText 底线约几毫秒。

输出:

enter image description here


1
您可以在android:focusable="false"之后添加android:longClickable="false",以便在触摸此视图时删除临时高亮显示。这也可以防止“全选”弹出窗口的出现。 - CzarMatt
@CzarMatt,你应该使用“cursor visible to false”。 - user14162811
使用键盘的“Enter”键和“imeOptions”中的“下一步”选项,您仍然可以在先前的EditText中输入。 - user924
当android:focusable="false"时,如何使文本可选择? - Mark Delphi

21

android:editable="false"已被废弃。你可以在EditText上使用InputType TYPE_NULL

像这样使用:

editText.setInputType(InputType.TYPE_NULL);

1
喜欢这个答案,因为它不会禁用字段上的 onClickListener。 - Harsh Ganatra
1
如果输入类型是密码,该怎么办?TYPE_NULL 会使密码可见。 - ilyamuromets
谢谢!它与android:focusable="false"一起工作,而android:inputType="none"则不行。在这种情况下,我们可以通过长按来粘贴文本。 - undefined

21

android:editable="false" 已被弃用。在 xml 中使用 android:enabled="false" 更为简单。为什么要写更多的代码呢?

如果你想在 java class 中使用,可以通过编程方式实现。

 editText.setEnabled(false);

使用 android:enabled="true" 以启用。 - android_jain
这会禁用滚动条,但我想要禁用编辑而不是滚动。 - Alberto M

9

简单来说:

editText.setEnabled(false);

1
它与先前的答案有何不同(作为问题)? - Onik
setFocusable(false) 也可以让你设置一个 OnClickListener。 - Oded Breiner

9

我正在使用谷歌新发布的 Material Design 库。在我的情况下,当我使用 android:focusable="false" 和 android:cursorVisible="false" 时,它可以正常工作。

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

8
为了禁用EditText的功能,只需使用以下代码:

EditText.setEnabled(false);

EditText.setInputType(InputType.TYPE_NULL);

如果您想启用它,可以使用以下方式:
EditText.setInputType(InputType.TYPE_CLASS_TEXT);

1
如果输入类型是密码,该怎么办?TYPE_NULL 会使密码可见。 - ilyamuromets
是的,这会破坏任何特定的输入类型(比如在我这里是 textMultiLine)。 - Alberto M

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