如何使一个EditText不可编辑/禁用

38

我有一个EditText,用户不应该能够输入。因此我尝试禁用它,方法是

edittext.setEnabled(false);
edittext.setClickable(false);

然而,当我从其他EditText中按下软键盘上的“下一个”按钮时,它仍然会将我定向到不应该可编辑的那个EditText,并且我能够在其中插入值。如何避免这种情况?


你在哪里使用这些命令?在哪个事件中? - olix20
你是否查看了https://dev59.com/a3NA5IYBdhLWcg3wkuzO? - olix20
你的问题类似于这个问题 https://dev59.com/g3RB5IYBdhLWcg3wUVxd - Avi Kumar
1
整个 EditText 的意义在于允许用户编辑其内容。你不使用 TextView 的原因是什么? - Marmoy
11个回答

39

这很好用; 只需将您的EditText的focusable属性设置为“false”,就完成了。

<EditText
        android:id="@+id/EditTextInput"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:gravity="right"
        android:cursorVisible="true">
    </EditText>

28
这不是一个可接受的答案,因为如果我们长按EditText,我们可以使用这个解决方案粘贴新数据。正确的解决方案是EditTextInput.setKeyListener(null); - Venkat
@Venkat 我同意答案不应该被接受。我们刚刚遇到了一个问题,其中 isFocusable = false 仍然允许长按并复制粘贴输入框中本应禁用的任何内容。你的答案实际上做到了预期的效果。 - NeverwinterMoon

36

不要搞乱自己。只需简单操作,使用下面的方法

首先,保存EditText的键监听器:

KeyListener mKeyListener = yourTextView.getKeyListener();
yourTextView.setKeyListener(null);

如果您想重新启用编辑,只需将保存的监听器重新分配即可:

yourTextView.setKeyListener(mKeyListener);

来源


如果您想从代码中执行此操作,这是最佳解决方案。 - Avi Levin
如果我想在禁用后启用它,该怎么办? - kirtan403
@kirtan403,请设置您的TextView.setKeyListener(您的监听器); - codercat
这是错误的。您仍然可以长按并剪切/复制/粘贴等操作。 - isudansh
这比setEnable更好,因为它不会导致键盘折叠。 - 林果皞
显示剩余2条评论

18
yourEditText.setKeyListener(null);

无需移除焦点并将可点击设置为false。

只需删除键盘监听器即可完成。

也已在Android 6.0上测试通过


这很棒,因为它不会改变EditText文本的颜色。 - manueGE

7
好的。我做了类似这样的事情并得到了结果。
    edittext.setEnabled(false);
    edittext.setGravity(Gravity.CENTER);
    edittext.setClickable(false);
    edittext.setFocusable(false);
    edittext.setFilters(new InputFilter[] { new textChange() });
    edittext.setInputType(0);

       class textChange implements InputFilter {
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {

        return dest.subSequence(dstart, dend);
    }
}

5
android:focusable="false"
android:longClickable="false"

添加这两个字段到您的EditText中将禁用焦点,并且禁止将数据复制粘贴到EditText字段中。

寻找一个仅限于XML的解决方案,这似乎可以很好地工作。 - ban-geoengineering

4
尝试添加以下代码: edittext.setFocusable(false); edittest.setFocusableInTouchMode(false); 这将使EditText不可编辑。

2
setFocusable(false) 会自动禁用 setFocusableInTouchMode - Nirmal

1

请看this

editText.setEnabled(false);editText.setFocusable(false); 可以实现此目的。


0
使用imeOptions属性将软键盘中的按钮更改为“完成”。
android:imeOptions="actionDone"
将其添加到要禁用的EditText之前即可。

0

这可能会对某些人有所帮助。 我找到了一个实现:

@Override
    public boolean onTouch(View v, MotionEvent event) {
        //for edit text
        return locked;
    }

locked 表示锁定状态。

当然,我必须使用 editText.setOnTouchListener(<listener>);


0
在你的EditText Xml代码中,粘贴下面这行。
android:focusable="false"

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