Как тиражировать android: editable = "false" в коде? - PullRequest
42 голосов
/ 19 марта 2009

В макете вы можете сделать виджет EditText недоступным для редактирования с помощью android:editable attribute.

Как я могу сделать это в коде? Мне нужно сделать виджет EditText доступным для редактирования в зависимости от условий.

Ответы [ 14 ]

38 голосов
/ 03 декабря 2010
editText.setFocusable(false);
editText.setClickable(false);

это гарантирует, что элемент управления EditText не может быть выбран и сфокусирован, поэтому его нельзя редактировать.

28 голосов
/ 14 февраля 2012

Я просто попробовал это сам,

Чтобы отключить редактирование текста:

.setFocusable(false);

это также устанавливает для setFocusableInTouchMode значение false!

Чтобы включить редактирование текста:

setFocusableInTouchMode(true);

это также устанавливает для setFocusable значение true;

15 голосов
/ 15 июня 2011

Лучший способ сделать это с помощью одной строки кода:

textView.setKeyListener(null);

Документы говорят для этого метода:

Устанавливает ключевой слушатель, который будет использоваться с это TextView. Это может быть нулевым для запретить ввод данных пользователем.

13 голосов
/ 26 мая 2009

Я думаю, что 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), чтобы преодолеть поведение, которое удаляет слова.

6 голосов
/ 12 апреля 2013
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);
5 голосов
/ 18 июля 2013

Вы можете попробовать это:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

Это полностью отключит EditText, отключит длительное нажатие, если вы не хотите, чтобы пользователь открывал опции редактирования текста.

3 голосов
/ 21 января 2010

[Отправка нового ответа, поскольку я не могу комментировать ответ Йозефа.]

Фильтр ввода работает нормально, но в нем есть небольшая ошибка: ввод текста над выделением удалит весь текст.

Например, скажем, у вас есть текст "foo" в EditText. Если вы выделите все это (например, дважды щелкнув по нему) и напечатаете 'a', текст исчезнет. Это потому, что InputFilter будет называться:

filter("a", 0, 1, "foo", 0, 3);

В этом случае предложенный входной фильтр вернет пустую строку (потому что src.length() < 1 - это false), что объясняет отсутствующий текст.

Решение состоит в том, чтобы просто вернуть dst.subSequence(dstart, dend) в функции фильтра. Это будет хорошо работать даже для удалений.

3 голосов
/ 19 марта 2009

Вы пробовали setText (java.lang.CharSequence, android.widget.TextView.BufferType) ? Это описано как:

Устанавливает текст, который должен отображать этот TextView (см. SetText (CharSequence)), а также задает, хранится ли он в настраиваемом / сменном буфере и доступен ли он для редактирования .

(акцент мой)

3 голосов
/ 19 марта 2009

Я не вижу связанный метод для этого атрибута в EditText учебный класс. Однако есть и другие подобные вещи, которые вы можете использовать, такие как android:focus/setFocusable(boolean) или создайте другой TextView, чей android:editable="false" и используйте setVisiblilty() для переключения между редактируемые и не редактируемые представления. Если вы используете View.GONE пользователь будет никогда не знаешь, что есть два EditTexts.

Если вы чувствуете амбициозность, вы, вероятно, могли бы что-то сделать со onTextChanged слушателем EditText, например, заставить его реагировать с setText.

2 голосов
/ 08 января 2016

Я думаю

Edittext.setEnabled(false); 

через код

и

android:enabled="false"

через xml. Также проверьте этот пост на SO .

Они должны работать, и вы можете снова включить программно Edittext.setEnabled(true);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...