46

在布局中,您可以EditText通过android:editable attribute.

我怎样才能在代码中做到这一点?我需要根据条件使EditText小部件可编辑。

4

14 回答 14

45
editText.setFocusable(false);
editText.setClickable(false);

这确保了EditText控件不能被选择和聚焦,所以它不能被编辑。

于 2010-12-03T01:41:28.663 回答
32

我自己也试过这个,

要禁用编辑文本:

.setFocusable(false);

这也将 setFocusableInTouchMode 设置为 false!

要启用编辑文本:

setFocusableInTouchMode(true);

这也将 setFocusable 设置为 true;

于 2012-02-14T10:56:48.347 回答
15

最好的方法是使用这行代码:

textView.setKeyListener(null);

文档说这种方法:

设置与此 TextView 一起使用的键侦听器。这可以为 null 以禁止用户输入。

于 2011-06-15T00:58:14.030 回答
13

我认为InputFilter拒绝所有更改是一个很好的解决方案:

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) : "";
        }
    }
});

编辑: dlazar 建议(如下)更改returndst.subSequence(dstart, dend)克服删除单词的行为。

于 2009-05-26T15:50:59.350 回答
6
android:editable="false" 
android:inputType="none" 

在您的 xml 或

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);

或者

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
于 2013-04-12T05:14:46.193 回答
5

你可以试试这个:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

这将完全禁用 EditText,如果您不希望用户打开编辑文本选项,请禁用长按。

于 2013-07-18T12:36:22.880 回答
3

我在 EditText 类中没有看到该属性的相关方法。但是,您可以使用其他类似的东西,例如 android:focus/setFocusable(boolean)或创建另一个 TextView, android:editable="false"用于setVisiblilty()在可编辑视图和不可编辑视图之间切换。如果您使用View.GONE用户将永远不会知道有两个 EditTexts。

如果您感到雄心勃勃,您可能可以对 EditText 的onTextChanged侦听器做一些事情,比如让它与setText.

于 2009-03-19T00:43:04.260 回答
3

你试过setText(java.lang.CharSequence, android.widget.TextView.BufferType)吗?它被描述为:

设置此 TextView 要显示的文本(请参阅 setText(CharSequence)),还设置它是否存储在可样式/可跨缓冲区中以及是否可编辑

(强调我的)

于 2009-03-19T15:03:13.333 回答
3

[发布新答案,因为我无法评论约瑟夫的答案。]

输入过滤器工作正常,但它有一个微妙的错误:在选择上键入将删除所有文本。

例如,假设您"foo"EditText. 如果您全选(例如,通过双击它)并输入'a',文本将消失。这是因为InputFilter将被称为:

filter("a", 0, 1, "foo", 0, 3);

在这种情况下,建议的输入过滤器将返回空字符串(因为src.length() < 1is false),这解释了丢失的文本。

解决方案是简单地dst.subSequence(dstart, dend)在过滤器函数中返回。即使对于删除,这也可以正常工作。

于 2010-01-21T20:51:51.683 回答
3

我猜

Edittext.setEnabled(false); 

通过代码

android:enabled="false"

通过 xml。也可以在SO上查看这篇文章。

它们应该可以工作,您可以以编程方式再次启用 Edittext.setEnabled(true);

于 2016-01-08T11:17:03.713 回答
1

如果您正在创建 EditView 的新实例,我还想指出一个可以很好地工作的替代解决方案。您可以按照文档的建议覆盖方法 getDefaultEditable() 以返回 false。例如

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};
于 2011-12-10T23:08:03.463 回答
0

我为这种情况找到的唯一解决方案是创建 2 个布局。一个是可编辑的,一个是不可编辑的。您可能需要根据各种条件创建 2 个以上的布局。将条件存储在SharedPreferences或其他方式中,重启Activity后根据条件加载相关布局。这是一个例子:

在活动的 onCreate() 中:

    configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
    manualSettingsMode = configuration.isManualSettingsMode();
    if(manualSettingsMode){
        setContentView(R.layout.editableconfigurationsettings);
    }else {
        setContentView(R.layout.configurationsettings);
    }

活动可以根据条件测试和调用函数重新启动,如下所示:

private void setManualEditing(){
    configuration.set_isManualSettingsMode(true);
    this.recreate();
}

private void setAutoEditing(){
    configuration.set_isManualSettingsMode(false);
    this.recreate();
}

希望这可以帮助。确实必须有更好的解决方案,但这就是我一直在做的事情。理想情况下,可以在单个字段上执行此操作,而不必重新加载活动/布局。-鲍比

于 2013-05-31T17:12:41.083 回答
-1

我认为达​​到预期效果的正确方法是:

mEditView.setText("my text", BufferType.NORMAL);

如果要在可编辑和不可编辑之间切换,可以执行以下操作:

// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);

// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
于 2010-12-14T10:38:46.357 回答
-1

试试这个:

 mEditText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (XXX) {
                return "";
            } else {
                return null;
            }
        }
    }});
于 2017-04-12T13:57:28.853 回答