在布局中,您可以设置 EditText 小部件是不可用的 android:editable attribute.

如何在代码中执行此操作?我需要做 EditText 小部件可根据条件进行编辑。

有帮助吗?

解决方案

我想一个 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) 克服删除单词的行为。

其他提示

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

这确保了 EditText 无法选择和专注于控制,因此无法对其进行编辑。

我只是自己尝试了

禁用编辑文本:

.setFocusable(false);

这也将setFocusableIntouchmode设置为false!

启用编辑文本:

setFocusableInTouchMode(true);

这也可以将setFocusupus设置为true;

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

textView.setKeyListener(null);

文档为此方法说:

设置与此文本视图一起使用的关键侦听器。这可以无效以禁止用户输入。

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);

您可以尝试一下:

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

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

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

如果您感到雄心勃勃,您可能可以用EditText做某事 onTextChanged 听众就像让它做出反应 setText.

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

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

例如,说你有文字 "foo" 在里面 EditText. 。如果您选择全部(例如,双击它)并键入 'a', ,文字将消失。这是因为 InputFilter 将被称为:

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

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

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

你有没有尝试过 setText(java.lang.charsequence,android.widget.textview.buffertype) ?被描述为:

设置此文本视图要显示的文本(请参阅setText(char sequence)),还设置了是否存储在可风格的/跨度缓冲区中 以及是否可以编辑.

(强调我的)

我猜

Edittext.setEnabled(false); 

通过代码

android:enabled="false"

通过XML.也检查此帖子 所以.

他们应该工作,您可以在编程中再次启用 Edittext.setEnabled(true);

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

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};

我在这种情况下发现的唯一解决方案是创建2个布局。一个是可编辑的,一个不是。您可能必须根据各种条件创建两个以上的布局。将条件存储在共享流或其他方式中,并根据重新启动活动后的条件加载相关布局。这是一个例子:

在活动的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();
}

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

我认为实现预期效果的正确方法是:

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);

尝试这个:

 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;
            }
        }
    }});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top