在布局中,您可以EditText
通过android:editable attribute
.
我怎样才能在代码中做到这一点?我需要根据条件使EditText
小部件可编辑。
在布局中,您可以EditText
通过android:editable attribute
.
我怎样才能在代码中做到这一点?我需要根据条件使EditText
小部件可编辑。
editText.setFocusable(false);
editText.setClickable(false);
这确保了EditText
控件不能被选择和聚焦,所以它不能被编辑。
我自己也试过这个,
要禁用编辑文本:
.setFocusable(false);
这也将 setFocusableInTouchMode 设置为 false!
要启用编辑文本:
setFocusableInTouchMode(true);
这也将 setFocusable 设置为 true;
最好的方法是使用这行代码:
textView.setKeyListener(null);
文档说这种方法:
设置与此 TextView 一起使用的键侦听器。这可以为 null 以禁止用户输入。
我认为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 建议(如下)更改return
以dst.subSequence(dstart, dend)
克服删除单词的行为。
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)
或创建另一个 TextView,
android:editable="false"
用于setVisiblilty()
在可编辑视图和不可编辑视图之间切换。如果您使用View.GONE
用户将永远不会知道有两个 EditTexts。
如果您感到雄心勃勃,您可能可以对 EditText 的onTextChanged
侦听器做一些事情,比如让它与setText
.
你试过setText(java.lang.CharSequence, android.widget.TextView.BufferType)吗?它被描述为:
设置此 TextView 要显示的文本(请参阅 setText(CharSequence)),还设置它是否存储在可样式/可跨缓冲区中以及是否可编辑。
(强调我的)
[发布新答案,因为我无法评论约瑟夫的答案。]
输入过滤器工作正常,但它有一个微妙的错误:在选择上键入将删除所有文本。
例如,假设您"foo"
在EditText
. 如果您全选(例如,通过双击它)并输入'a'
,文本将消失。这是因为InputFilter
将被称为:
filter("a", 0, 1, "foo", 0, 3);
在这种情况下,建议的输入过滤器将返回空字符串(因为src.length() < 1
is false
),这解释了丢失的文本。
解决方案是简单地dst.subSequence(dstart, dend)
在过滤器函数中返回。即使对于删除,这也可以正常工作。
我猜
Edittext.setEnabled(false);
通过代码
和
android:enabled="false"
通过 xml。也可以在SO上查看这篇文章。
它们应该可以工作,您可以以编程方式再次启用 Edittext.setEnabled(true);
如果您正在创建 EditView 的新实例,我还想指出一个可以很好地工作的替代解决方案。您可以按照文档的建议覆盖方法 getDefaultEditable() 以返回 false。例如
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
我为这种情况找到的唯一解决方案是创建 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();
}
希望这可以帮助。确实必须有更好的解决方案,但这就是我一直在做的事情。理想情况下,可以在单个字段上执行此操作,而不必重新加载活动/布局。-鲍比
我认为达到预期效果的正确方法是:
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;
}
}
}});