使EditText ReadOnly
我想创build一个只读的EditText
视图。 执行此代码的XML似乎是android:editable="false"
,但我想在代码中执行此操作。
我怎样才能做到这一点?
请使用此代码..
Edittext.setEnabled(false);
如果你setEnabled(false)
那么你的editText
将看起来禁用(灰色等)。 你可能不想改变编辑器的视觉方面。
一个不太干扰的方法是使用setFocusable(false)
。
我相信这会更接近你的初衷。
在XML中使用
android:editable="false"
例:
<EditText android:id="@+id/EditText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:editable="false" />
这适用于我:
EditText.setKeyListener(null);
最好的是通过使用TextView
来代替。
在XML中设置
android:inputType="none"
editText.setInputType(InputType.TYPE_NULL);
根据文档,这可以防止显示软键盘。 它也可以防止粘贴,允许滚动,不会改变视图的视觉方面。 但是,这也阻止了在视图内select和复制文本。
从我的testing设置setInputType
到TYPE_NULL
似乎function相当于折旧的android:editable="false"
。 另外, android:inputType="none"
似乎没有明显的效果。
写这两行对于你的工作已经绰绰有余了。
yourEditText.setKeyListener(null); yourEditText.setEnabled(false);
尝试使用
editText.setEnabled(false); editText.setClickable(false);
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) : ""; } } });
这会给你不可编辑的EditTextfilter。 你首先需要把你想要的文本放在editText字段上,然后应用这个filter。
android:editable
如果设置,则指定此TextView
具有input方法。 除非另有规定,否则这将是一个文本。 对于TextView
,默认情况下这是false。 对于EditText
,默认情况下是true。
必须是boolean
值,无论是true
还是false
。
这也可以是对包含此types值的资源(forms为@[package:]type:name
)或主题属性(forms为?[package:][type:]name
)的引用。
这对应于可编辑的全局属性资源符号。
相关方法
尝试覆盖编辑文本的onLongClick监听器以删除上下文菜单:
EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id); myTextField.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } });
这是我的实现(有点长,但对我有用!):使用此代码,您可以使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,但内容不可改变。 返回值应该保持为一个variables,以便能够从只读状态恢复到正常状态。
使EditText只读,只是把它作为:
TextWatcher tw = setReadOnly(editText, true, null);
并从之前的声明中正常使用tw:
setReadOnly(editText, false, tw);
这对我有用,考虑到上面的几个build议。 使TextEdit可以聚焦,但是如果用户单击或关注,我们将在PopupWindow中显示一个select列表。 (我们正在取代古怪的微调控件)。 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); } }
如果您只是想从控件中复制文本,但无法编辑它,则可能需要使用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为真,使其与触摸input工作。
我没有任何问题使EditTextPreference只读,通过使用:
editTextPref.setSelectable(false);
当使用“摘要”字段来显示只读字段(例如,用于显示帐户信息)时,此function会很好。 从http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.htmldynamic更新摘要字段;
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()); } } }
在EdiTextView xml文件中设置
android:focusable="false"
edtext.setEnabled(false); edtext.setClickable(false); edtext.setKeyListener(null);