如何在代码中复制Android:可编辑=“ false”?
-
20-08-2019 - |
题
在布局中,您可以设置 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建议(以下)改变 return
至 dst.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() < 1
是 false
),解释缺失文本。
解决方案是简单地返回 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;
}
}
}});