在布局中,您可以通过EditText
将android:editable attribute
窗口小部件设置为不可编辑。
我怎样才能在代码中执行此操作?我需要根据条件使EditText
窗口小部件可编辑。
答案 0 :(得分:38)
editText.setFocusable(false);
editText.setClickable(false);
这可确保无法选择和关注EditText
控件,因此无法进行编辑。
答案 1 :(得分:27)
我自己就试过了,
禁用编辑文字:
.setFocusable(false);
这也将setFocusableInTouchMode设置为false!
启用编辑文字:
setFocusableInTouchMode(true);
这也将setFocusable设置为true;
答案 2 :(得分:15)
最好的方法是使用这一行代码:
textView.setKeyListener(null);
文档说这个方法:
设置要使用的键侦听器 这个TextView。这可以为null 禁止用户输入。
答案 3 :(得分: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建议(下方)将return
更改为dst.subSequence(dstart, dend)
,以克服删除字词的行为。
答案 4 :(得分: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);
答案 5 :(得分:5)
你可以试试这个:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
这将完全禁用EditText,如果您不希望用户打开编辑文本选项,请禁用长按。
答案 6 :(得分:3)
我没有在EditText中看到该属性的相关方法
类。但是,您可以使用其他类似的东西,例如
android:focus/setFocusable(boolean)
或创建另一个TextView
android:editable="false"
并使用setVisiblilty()
切换
可编辑且不可编辑的视图。如果您使用View.GONE
,用户将会
永远不知道有两个EditTexts。
如果你有野心,你可能会对EditText的onTextChanged
听众做一些事情,比如让它与setText
做出反应。
答案 7 :(得分:3)
你试过setText(java.lang.CharSequence, android.widget.TextView.BufferType)吗? 它被描述为:
设置此TextView要显示的文本(请参阅setText(CharSequence)),并设置它是否存储在可设置/可跨越缓冲区以及是否可编辑。
(强调我的)
答案 8 :(得分:3)
[发表新答案,因为我无法对Josef的答案发表评论。]
输入过滤器工作正常,但它有一个微妙的错误:在选择上键入将删除所有文本。
例如,假设您在"foo"
中有文字EditText
。如果您全部选中(例如,双击它)并输入'a'
,文本将消失。这是因为InputFilter
将被称为:
filter("a", 0, 1, "foo", 0, 3);
在这种情况下,建议的输入过滤器将返回空字符串(因为src.length() < 1
是false
),这解释了缺少的文本。
解决方案是简单地在过滤器函数中返回dst.subSequence(dstart, dend)
。即使删除也可以正常工作。
答案 9 :(得分:2)
我想
Edittext.setEnabled(false);
通过代码
和
android:enabled="false"
通过xml.Also查看SO上的这篇文章。
他们应该工作,您可以以编程方式再次启用Edittext.setEnabled(true);
答案 10 :(得分:1)
我还想指出一个替代解决方案,如果您正在创建EditView的新实例,它可以很好地工作。您可以按文档建议覆盖方法getDefaultEditable()以返回false。 E.g。
EditText view = new EditText(DiscountCalculator.this) {
public boolean getDefaultEditable() {
return false;
}
};
答案 11 :(得分:0)
我在这个场景中找到的唯一解决方案是创建2个布局。一个是可编辑的,一个不是。您可能必须根据各种条件创建2个以上的布局。将条件存储在SharedPreferences或其他方法中,并在重新启动活动后根据条件加载相关布局。这是一个例子:
在活动的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
答案 12 :(得分:-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);
答案 13 :(得分:-1)
试试这个:
var current = {
coordinates: "2208,1922",
name: "current"
}
var Photo = {
current: current,
start: {
coordinates: '2408,1822',
name: 'start',
newCoordinates: current.coordinates
}
};
console.log(Photo);