Сделать EditText Только Для Чтения
Я хочу сделать только для чтения EditText
вид. XML для выполнения этого кода, кажется,android:editable="false"
, но я хочу сделать это в коде.
Как я могу это сделать?
19 ответов:
Если вы
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.setInputType(InputType.TYPE_NULL);
на docs это предотвращает отображение мягкой клавиатуры. Он также предотвращает вставку, позволяет прокручивать и не изменяет визуальный аспект представления. Однако, это также предотвращает выделение и копирование текста в представлении.
из моих тестов задание
setInputType
toTYPE_NULL
похоже, функционально эквивалентно амортизированномуandroid:editable="false"
. Кроме того,android:inputType="none"
кажется, не имеет никакого заметного эффекта.
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, а затем применить этот фильтр.
написание этих двух строк более чем достаточно для вашей работы.
yourEditText.setKeyListener(null); yourEditText.setEnabled(false);
android:editable
если установлено, указывает, что это
TextView
есть метод ввода. Он будет текстовым, если не указано иное. ИбоTextView
, по умолчанию это значение равно false. ИбоEditText
, Это правда по умолчанию.должен быть
boolean
значением, либоtrue
илиfalse
.это также может быть ссылка на ресурс (в форме
@[package:]type:name
) или атрибут темы (в виде?[package:][type:]name
), содержащий значение этого типа.это соответствует символ ресурса глобального атрибута доступен для редактирования.
Связанные Методы
android: editable= "false" опустился. Поэтому вы не можете использовать его, чтобы сделать текст редактирования только для чтения.
Я сделал это с помощью приведенного ниже решения. Здесь я использовал
android:inputType= "none"
android: textIsSelectable= "true"
android: focusable= "false"
дать ему попробовать :)
<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"/>
попробуйте переопределить прослушиватель onLongClick для редактирования текста, чтобы удалить контекстное меню:
EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id); myTextField.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { return true; } });
Это моя реализация (немного длинная, но полезная для меня!): С помощью этого кода Вы можете сделать EditView доступным только для чтения или обычным. даже в состоянии только для чтения, текст может быть скопирован пользователем. вы можете изменить backgroud, чтобы он выглядел иначе, чем обычный 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);
это сработало для меня, принимая во внимание несколько предложений выше. Делает TextEdit фокусируемым, но если пользователь нажимает или фокусируется, мы показываем список выборок во всплывающем окне. (Мы заменяем дурацкий виджет 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); } }
Если вы просто хотите иметь возможность копировать текст из элемента управления, но не иметь возможности редактировать его, вы можете использовать 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, кликабельны, и longClickable одно и то же значение...
однако мне пришлось явно установить focusable и focusableInTouchMode в true, чтобы заставить его работать с сенсорным вводом.
у меня не было проблем с созданием EditTextPreference только для чтения, используя:
editTextPref.setSelectable(false);
это хорошо работает в сочетании с использованием поля "сводка" для отображения полей только для чтения (полезно для отображения информации об учетной записи, например). Обновление полей сводки, динамически захваченных из 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()); } } }