使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设置setInputTypeTYPE_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);