我想制作只读EditText
视图。执行此代码的XML似乎是android:editable="false"
,但我想在代码中执行此操作。
我该怎么做?
答案 0 :(得分:121)
请使用此代码..
Edittext.setEnabled(false);
答案 1 :(得分:90)
如果您setEnabled(false)
,则editText
看起来会被禁用(灰色等)。您可能不想更改编辑器的可视方面。
一种不太干扰的方法是使用setFocusable(false)
。
我相信这会更接近您的初步意图来回答您的问题。
答案 2 :(得分:27)
在XML
中使用:
android:editable="false"
举个例子:
<EditText
android:id="@+id/EditText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:editable="false" />
答案 3 :(得分:20)
这对我有用:
EditText.setKeyListener(null);
答案 4 :(得分:14)
最好是使用TextView
代替。
答案 5 :(得分:12)
editText.setInputType(InputType.TYPE_NULL);
根据docs,这可以防止显示软键盘。它还可以防止粘贴,允许滚动并且不会改变视图的视觉方面。但是,这也会阻止在视图中选择和复制文本。
从我的测试设置setInputType
到TYPE_NULL
似乎在功能上等同于折旧的android:editable="false"
。此外,android:inputType="none"
似乎没有明显效果。
答案 6 :(得分:7)
editText.setEnabled(false);
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) : "";
}
} });
这将为您提供无法编辑的EditText过滤器。首先需要将所需的文本放在editText字段上,然后应用此过滤器。
答案 7 :(得分:6)
android:editable =&#34; false&#34; 已弃用。因此,您无法使用它来使编辑文本只读。
我使用波纹管解决方案完成了这项工作。我在这里用过
android:inputType =&#34; none&#34;
android:textIsSelectable =&#34; true&#34;
<强>机器人:可聚焦=&#34;假&#34; 强>
尝试尝试:)
<EditText
android:id="@+id/et_newsgpa_university"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:hint="@string/hint_educational_institute"
android:textSize="@dimen/regular_text"
android:inputType="none"
android:textIsSelectable="true"
android:focusable="false"
android:maxLines="1"
android:imeOptions="actionNext"/>
答案 8 :(得分:5)
yourEditText.setKeyListener(null);
yourEditText.setEnabled(false);
答案 9 :(得分:5)
以XML格式设置
android:inputType="none"
答案 10 :(得分:4)
尝试使用
editText.setEnabled(false);
editText.setClickable(false);
答案 11 :(得分:3)
android:editable
如果设置,则指定此TextView
具有输入方法。除非另有说明,否则它将是文本的。对于TextView
,默认情况下为false。对于EditText
,默认情况下为真。
必须是boolean
值,true
或false
。
这也可能是对包含此类型值的资源(格式为@[package:]type:name
)或主题属性(格式为?[package:][type:]name
)的引用。
这对应于可编辑的全局属性资源符号。
相关方法
答案 12 :(得分:2)
尝试覆盖编辑文本的onLongClick侦听器以删除上下文菜单:
EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
答案 13 :(得分:2)
使用此代码:
editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);
禁用editText
会提供只读外观和行为,但也会将text-color
更改为灰色,因此需要设置其文本颜色。
答案 14 :(得分:1)
这是我的实现(有点长,但对我有用!): 使用此代码,您可以将EditView设置为只读或正常。即使在只读状态下,文本也可以由用户复制。您可以更改背景,使其看起来与普通的EditText不同。
public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
edt.setCursorVisible(!readOnlyState);
TextWatcher tw = null;
final String text = edt.getText().toString();
if (readOnlyState) {
tw = new TextWatcher();
@Override
public void afterTextChanged(Editable s) {
}
@Override
//saving the text before change
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
// and replace it with content if it is about to change
public void onTextChanged(CharSequence s, int start,int before, int count) {
edt.removeTextChangedListener(this);
edt.setText(text);
edt.addTextChangedListener(this);
}
};
edt.addTextChangedListener(tw);
return tw;
} else {
edt.removeTextChangedListener(remove);
return remove;
}
}
此代码的好处是,EditText显示为普通的EditText,但内容不可更改。返回值应保存为一个变量,以便能够从只读状态恢复到正常状态。
将EditText设为只读,只需将其设为:
TextWatcher tw = setReadOnly(editText, true, null);
并使其正常使用tw来自之前的陈述:
setReadOnly(editText, false, tw);
答案 15 :(得分:1)
这对我有用,考虑了上面的一些建议。使TextEdit可聚焦,但如果用户单击或聚焦,我们将在PopupWindow中显示选择列表。 (我们正在取代古怪的Spinner小部件)。 TextEdit xml非常通用......
public void onCreate(Bundle savedInstanceState) {
....
fEditState = (EditText) findViewById(R.id.state_edit);
fEditState.setLongClickable(false);
fEditState.setKeyListener(null);
fEditState.setFocusable(true);
fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus)
{
if (hasFocus)
{
showStatesPopup();
}
}
});
fEditState.setOnClickListener(new Button.OnClickListener(){
public void onClick(View arg0)
{
showStatesPopup();
}
});
....
}
private void showStatesPopup()
{
// fPopupWindowStates instantiated in OnCreate()
if (!fPopupWindowStates.isShowing()) {
// show the list view as dropdown
fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
}
}
答案 16 :(得分:1)
如果您只是希望能够从控件中复制文本但无法对其进行编辑,则可能需要使用 TextView ,并设置文本 <强>可选强>
代码:
myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);
的xml:
<TextView
android:textIsSelectable="true"
android:focusable="true"
android:focusableInTouchMode="true"
...
/>
<!--android:selectAllOnFocus="true"-->
setTextIsSelectable的文档说:
当您调用此方法来设置textIsSelectable的值时,它会将标记为focusable,focusableInTouchMode,clickable和longClickable设置为相同的值...
但是我必须将focusable和focusableInTouchMode显式设置为true才能使其与触摸输入一起使用。
答案 17 :(得分:0)
不推荐使用android:editable=""
,
设置
android:clickable="false"
android:focusable="false"
android:inputType="none"
android:cursorVisible="false"
将其设置为“只读”。
但是,用户仍然可以粘贴到该字段中或执行任何其他长按动作。要禁用此功能,只需重写onLongClickListener()。
在科特林:
myEditText.setOnLongClickListener { true }
足够。
答案 18 :(得分:0)
我的解决方法是创建一个自定义TextWatcher类,如下所示:
class ReadOnlyTextWatcher implements TextWatcher {
private final EditText textEdit;
private String originalText;
private boolean mustUndo = true;
public ReadOnlyTextWatcher(EditText textEdit) {
this.textEdit = textEdit;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (mustUndo) {
originalText = charSequence.toString();
}
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (mustUndo) {
mustUndo = false;
textEdit.setText(originalText);
} else {
mustUndo = true;
}
}
}
然后,您只需将该观察者添加到您希望即使已启用也只能读取的任何字段:
editText.addTextChangedListener(new ReadOnlyTextWatcher(editText));
答案 19 :(得分:0)
对我来说,这是唯一完整的简单解决方案。
editText.setEnabled(false); // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard
答案 20 :(得分:0)
在EdiTextView xml文件中设置
android:focusable="false"
答案 21 :(得分:0)
使用:
将EditTextPreference设为只读是没有问题的editTextPref.setSelectable(false);
当使用&#39;摘要&#39;字段显示只读字段(例如,用于显示帐户信息)。从http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html
动态抢夺更新摘要字段private static final List<String> keyList;
static {
keyList = new ArrayList<String>();
keyList.add("field1");
keyList.add("field2");
keyList.add("field3");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
initSummary(getPreferenceScreen().getPreference(i));
}
}
private void initSummary(Preference p) {
if (p instanceof PreferenceCategory) {
PreferenceCategory pCat = (PreferenceCategory) p;
for (int i = 0; i < pCat.getPreferenceCount(); i++) {
initSummary(pCat.getPreference(i));
}
} else {
updatePrefSummary(p);
}
}
private void updatePrefSummary(Preference p) {
if (p instanceof ListPreference) {
ListPreference listPref = (ListPreference) p;
p.setSummary(listPref.getEntry());
}
if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
//editTextPref.setEnabled(false); // this can be used to 'gray out' as well
editTextPref.setSelectable(false);
if (keyList.contains(p.getKey())) {
p.setSummary(editTextPref.getText());
}
}
}