在Android中禁用EditText


195

在我的应用程序中,我有一个EditText,该用户仅具有读取权限,而没有写入权限。

用代码设置android:enabled="false"

尽管EditText的背景变为深色,但是当我单击它时,键盘会弹出,并且可以更改文本。

我应该设置什么来禁用EditText?


2
可以同时保留视图样式和滚动行为。要EditText在保留此属性的同时禁用它,只需UI.setReadOnly(myEditText, true)此库中使用。如果要在没有库的情况下复制此行为,请查看此小方法的源代码
caw

Answers:


245

我相信正确的选择是确定android:editable="false"

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

EditText是TextView上的薄单板,可将其配置为可编辑的。

更新:
如以下注释中所述,editable已弃用(自API级别3以来)。您应该改为使用inputType(带有值none)。


感谢Nailuj,不幸的是它没有用。添加建议后,将弹出键盘,并且可以更改文本。
Hesam

17
android:editable已弃用。应该改用android:inputType =“ none”,但它包含错误,并且不起作用。如果大家都在这里
加注

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
渐近线2012年

28
android:editable="false" android:focusable="false"对我来说很棒(忘了弃用,我认为android:editable与android:inputType无关)
Muhammad Babar

8
对于所有无法使用android:inputType =“ none”的用户,请尝试:android:inputType =“ none”与android:focusable =“ false”
Surendra Kumar,

161

用于EditText.setFocusable(false) 禁用编辑
EditText.setFocusableInTouchMode(true)以启用编辑;


它可以工作,但是不是一个好习惯,因为视图看起来可以编辑但不能编辑。对我来说效果很好,因为我的视图具有自定义背景,因此+1。
金田

4
@金田 我实际上更喜欢这个。我不要我的盒子变灰。:)
Doomsknight

1
在Android 4.4中,此选项保留原始文本的颜色。使用editText.setEnabled(false);会将文本颜色更改为灰色。但是,微调器在使用时不会更改文本颜色setEnabled,因此会带来不一致的体验。
tbraun 2014年

为什么不setFocusable(true)呢?看到这个链接之间的区别setFocusable()setFocusableInTouchMode()stackoverflow.com/questions/23799064/...
kenju

这真的符合我的需求。我创建了一个内部包含EditText的复合自定义视图。我在使我的自定义视图仅接受点击但无法编辑时遇到问题,因为这会启动日期选择器对话框。此解决方案有效,因为它不会禁用
onClickListeners

64

您可以尝试以下方法:

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

启用EditText:

启用的EditText

禁用EditText:

禁用EditText

它对我有用,希望对您有帮助。


1
这看起来像一个TextView。太神奇了 这就是我想要的。
Yunus

4
如果有人在启用备份方面遇到同样的问题,您必须打电话editText.setFocusableInTouchMode(true)代替editText.setFocusable(true)
Dart Dega

61

使用此功能禁用用户输入

android:focusable="false"

android:editable =“ false”不推荐使用此方法。


1
这应该是公认的答案。按照其他答案中的建议将输入类型设置为“无”(总是)不起作用。启用为“ false”的设置会阻止编辑,但也会使可能不需要的文本变暗。
杰瑞(Jerry)

36

对于禁用编辑EditText,我认为我们可以使用focusable OR, enable

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

    它还会将文本颜色更改EditText为灰色。
    单击时无效

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

    不会更改的颜色。EditText
    单击时,它会高亮显示EditText底线约几毫秒

输出量

在此处输入图片说明



17

由于android:editable="false"弃用xml

使用android:enabled="false"很简单。为什么要使用更多代码?

如果您愿意,java class还可以以编程方式使用此功能

 editText.setEnabled(false);

使用android:enabled =“ true”启用
android_jain,


5

在类中设置以下属性:

editText.setFocusable(false);
editText.setEnabled(false);

它会根据您的要求顺利运行。


只有enabled足够
ateebahmed

5

要禁用EditText的功能,只需使用:

EditText.setInputType(InputType.TYPE_NULL);

如果您想以某种方式启用它,则可以使用:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

如果inputType是password,该怎么办?TYPE_NULL使密码可见。
ilyamuromets

4

如果您使用android:editable="false",则eclipse会提醒您此消息“不推荐使用android:editable:改为使用inputType”。

因此,我android:focusable="false"改为使用它,对我来说效果很好。


4
android:editable="false"

现在已弃用并使用

 YourEditText.setInputType(InputType.TYPE_NULL);

如果inputType是password,该怎么办?TYPE_NULL使密码可见。
ilyamuromets

@ilyamuromets这个答案可能会帮助stackoverflow.com/a/16720520/7704650TYPE_TEXT_VARIATION_PASSWORD按照本作更developer.android.com/reference/android/text/InputType
emkarachchi

我想在打开软键盘并尝试输入文本时禁用EditText中的输入。InputType.TYPE_NULL与isFocusable和isFocusableInTouchMode的false值配合使用时效果很好。但是,如果输入字段的inputType为textPassword,则InputType.TYPE_NULL使密码值可见。如果我设置InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD,则密码也将变为可见,用户可能会输入文本。
ilyamuromets


3

禁用= FOCUS + CLICK + CURSOR

禁用焦点,单击和光标可见性对我来说有用。

这是XML中的代码

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />

2

这将使您的edittext 禁用

editText.setEnabled(false);

并通过使用

editText.setInputType(InputType.TYPE_NULL);

只会使您的Edittext 不显示您的软键盘,但是如果将它连接到物理键盘,它将允许您键入。


如果inputType是password,该怎么办?TYPE_NULL使密码可见。
ilyamuromets

2

我使用的是Google新发布的材料设计库。就我而言,当我使用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>

1

就我而言EditText,如果没有,我需要滚动文本。的行数超过maxLines其禁用时间。这个实现对我来说非常完美。

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

试试这个,对我来说很好:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

注意:您需要添加this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 活动,否则keyboard将在第一时间弹出


1

就像一些答案提到的那样,如果禁用editText,他会变成灰色,如果将focus设置为false,则会显示光标。

如果您只想使用xml,那么就可以了

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

我只是添加一个出现在editText上方的FrameLayout并将其设置为可聚焦和可单击,以使editText不能被单击。


0

这对我有用:

android:focusable =“ false”


2
这与Sampath Kumar 4年前发布的内容有何不同?
gobrewers14

0

从@Asymptote对已接受答案的评论中,使用:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

...而鲍勃是你的叔叔。


0

今天我仍然用editable="false",也用focusable="false"

我认为我们需要使EditText不可编辑的情况是,因为我们希望保持其EditText样式(带有下划线,带有提示等),但是它接受其他输入而不是文本。例如,一个下拉列表。

在这种用例中,我们需要EditText可点击的(因此enabled="false"不合适)。设置focusable="false"此技巧后,我仍然可以长时间按住EditText并将自己的文本从剪贴板粘贴到该文本上。根据您的代码和处理方式,这甚至可能使您的应用程序崩溃。

所以我也习惯editable="false"了,除了警告,一切都很好。


0

您可以使用 android:focusable="false"但也需要禁用光标,否则复制/粘贴功能仍将起作用。

因此,使用

android:focusable="false"
android:cursorVisible="false"

0

有多个是如何实现多个级别的残疾人的。

  • editText.setShowSoftInputOnFocus(false);editText.setFocusable

防止EditText显示键盘-输入一些文字。但是光标仍然可见,用户可以粘贴一些文本。

  • editText.setCursorVisible(false)

隐藏光标。不知道为什么要这么做。用户可以输入文字并粘贴。

  • editText.setKeyListener(null)

我觉得这种方式最方便。用户无法输入文本,但是OnClickListener如果要在用户触摸时触发操作,则仍可以使用小部件

  • editText.setEnabled(false);

完全禁用EditText。它实际上是“只读”的,用户不能在其中输入任何文本,并且(例如)OnClickListener 不能使用它。

TextEdit 文档


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.