Как сделать EditText недоступным для редактирования через XML в Android?

300

Может кто-нибудь сказать мне, как сделать EditTextне редактируемым через XML? Я попытался установить android:editableв false, но

  1. это устарело; и
  2. это не сработало.
Фрэн Фицпатрик
источник
6
Если не редактируемый, зачем вам нужен EditText? Достаточно ли использовать обычный TextView? И функция setEditable () тоже устарела?
Кики
4
Для меня это имеет смысл для того, чтобы включить стандартную копию для вставки содержимого. С TextView это невозможно (по крайней мере, поведение по умолчанию)
Ixx
1
Исправление: это плохая идея. При определенных обстоятельствах представление становится редактируемым, или параметры вставки копии больше не отображаются. Будем искать другой подход.
Ixx
11
В моем случае я хочу временно отключить EditText во время выполнения набора операций, а затем снова включить его после завершения операции.
Джо Планте
1
Этот вопрос о законной заботе. Для того, чтобы сохранить EditTextстиль и разрешение скроллинг, использование UI.setReadOnly(myEditText, true)из этой библиотеки . Необходимо установить несколько свойств, которые вы можете проверить в исходном коде .
Caw

Ответы:

399

Используйте этот простой код:

textView.setKeyListener(null);

Оно работает.

Редактировать: чтобы добавить KeyListenerпозже, сделайте следующее

1: установить ключевой слушатель на тег textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: получить ключевой слушатель из тега и установить его обратно textView

textView.setKeyListener((KeyListener) textView.getTag());
Kristiono Setyadi
источник
30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); установите его позже с помощью textView.setKeyListener ((KeyListener) textView.getTag ());
Томас Диньян
@ TomDignan отличный способ легко к этому! У меня есть один вопрос. Изменяет ли это каким-либо образом значения по умолчанию, необходимые для KeyListener, например, setFocusable()потому что в документе сказано, что реализация по умолчанию может быть изменена при изменении.
Энди
afaik нет, тег должен быть доступен для использования
Thomas Dignan
Эй, твое предложение помогло мне
..
38
Вопрос был о настройке через XML , почему это помечено как решение?
Денис Виталий
398

Добавьте это в ваш XML-файл EditText:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Это сделает тот же эффект, что и android:editable="false". Сработало для меня, надеюсь, это сработает и для вас.

GalDude33
источник
3
notes.setKeyListener (нуль); notes.setClickable (ложь); notes.setCursorVisible (ложь); notes.setFocusable (ложь); notes.setFocusableInTouchMode (ложь);
Джек Франзен
3
Если вы хотите сделать это в XML ... какая разница между ним и TextView ???
Крис Сим
11
Разница в том, что он может быть использован сTextInputLayout
Ахмадалибалоч
2
Это должно быть помечено как решение, так как это чистое XML-решение, как было указано в вопросе.
zgc7009
2
Это устарело (октябрь 2018 года)
Себастьян Падуано
54

Пусть ваш Edittext будет

EditText editText;

editText.setKeyListener(null);

будет работать, но он просто не слушает ключи.

Пользователь может видеть курсор на тексте редактирования.

Можешь попробовать editText.setEnabled(false);

Это означает, что пользователь не может видеть курсор. Проще говоря, это станет TextView.

Махендран
источник
3
Это правильно, так как EditText является подклассом TextView. Однако, пожалуйста, используйте editText в качестве переменной вместо textView.
Джо Планте
@JoePlante Изменено имя переменной, спасибо за конструктивный комментарий.
Махендран
это скрывает EditText
Стивен
Затененный EditText указывает, что он отключен, и пользователь не может его редактировать.
Махендран
Установка цвета, а также предотвратит появление серого. XML: Попробуйте android: textColor = "@ color / Black" android: enabled = "false"
Красное вино
32

Как упоминалось в других ответах, вы можете сделать это, setEnabled(false) но так как вы спрашиваете, как установить его через XML, вот как это сделать.

Добавьте следующий атрибут к вашему EditText:

android:enabled="false"
Вида
источник
4
Точный ответ на вопрос ОП.
SMR
но этот метод устарел
Лалит Кумар
2
@Lalitkumar enabledне рекомендуется. editableявляется.
InsanityOnABun
7
при включении мы также не можем получить доступ к прослушивателю кликов. так что для меня это не ответ.
Навид Ахмад
это скрыть текст :(
Chego
24

отключить из XML (одна строка):

 android:focusable="false"

при необходимости повторно включите из Java (также одной строкой):

editText.setFocusableInTouchMode(true);
kouretinho
источник
Хороший ответ. Таким образом, вы все равно можете установить значение editText, используя editText.setText («ваш текст»). Но пользователь не может редактировать его.
Пракаш
17

Они сделали «редактируемые» устаревшими, но не предоставили рабочую соответствующую в inputType.

Кстати, inputType = "none" не имеет никакого эффекта? Использование этого или нет не имеет никакого значения, насколько я вижу.

Например, editText по умолчанию называется одной строкой. Но вы должны выбрать inputType, чтобы он был одной строкой. И если вы выберете «нет», он все равно будет многострочным.

Timuçin
источник
1
Это не имеет значения на всех устройствах, но это должно , согласно документам: developer.android.com/reference/android/widget/…
caw
12
Прекрасный пример гугл беспорядка
Яр
14

Эта комбинация работала для меня:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>
Массимо Фаззолари
источник
13

Как вы упомянули Android: редактируемый устарел. android: inputType = "none" следует использовать вместо этого, но он не работает из-за ошибки ( https://code.google.com/p/android/issues/detail?id=2854 )

Но вы можете добиться того же, используя фокусируемый.

Через XML:

<EditText ...
        android:focusable="false" 
</EditText>

Из кода:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
Адоржан Принц
источник
Благодаря Google, ошибка будет делиться на два разных сценария: 1.) Это будет исправлено, но через 6 лет 2.) Это никогда не будет исправлено, они просто разработают новую версию Android.
Неоновая варжа
12

если вы хотите щелкнуть по нему, но не хотите его редактировать, попробуйте:

        android:focusable="false"
Кай Ван
источник
8

Просто используйте android:enabled="false". Это также придаст вид, EditTextкоторый сделает его не редактируемым.

Шахид Сарвар
источник
7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

и используйте следующее:

txtDate.setKeyListener(null);
askimp
источник
7

Если вы хотите сделать это в коде Java, просто используйте эту строку, чтобы отключить это:

editText.setEnabled(false);

И это, чтобы включить его:

editText.setEnabled(true);
user3185897
источник
5

Я пытался сделать:

textView.setInputType( InputType.TYPE_NULL );

который должен работать, но для меня это не так.

Я закончил с этим кодом:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

который работает отлично.

Saric
источник
4

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

Добавление атрибутов в основной макет

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

а затем поле EditText

android:focusable="false"
android:focusableInTouchMode="false"

Вот пример:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>
Woppi
источник
4
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Атрибут «longClickable» отключает длительное нажатие, при котором параметры «Вставить» или «Выбрать все» отображаются в виде всплывающей подсказки.

Радхей
источник
3

В дополнение к @mahe madi вы можете попробовать это

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Этот метод скрывает курсор, теряет фокус и, что более важно, устанавливает цвет текста на черный, ведущий себя как TextView.

И чтобы вернуться к editText, просто сделайте это, чтобы получить все свойства EditText.

editText.setEnabled(true);

Надеюсь, поможет :)

Суперпользователь
источник
3

Вы можете использовать, android:editable="false"но я бы посоветовал вам использовать setEnabled(false)его, поскольку он предоставляет пользователю визуальную подсказку о том, что элемент управления нельзя редактировать. Одна и та же визуальная подсказка используется всеми отключенными виджетами, и последовательность хорошая.

jclafuente
источник
2

Я пробовал следующее:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

но проблема заключалась в том, что если текст редактирования является первым в форме, тогда он получает фокус, и сразу вызывается код pickCode (), который запускает новое действие. Поэтому я изменил код следующим образом, и он, кажется, работает довольно хорошо (за исключением того, что я не могу установить фокус на редактирование текста, но мне это не нужно):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Наилучшие пожелания,

Комментарии приветствуются,

Джон Гош

johngoche9999
источник
1
Кажется, работает нормально, но не проще ли использовать TextView, который выглядит как EditText (используя: style = "@ android: style / Widget.EditText")?
Android-разработчик
2

Я использую EditText.setFocusable(false)и снова устанавливаю true, если я хочу редактировать.

nobjta_9x_tq
источник
2

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

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"
Лео
источник
1

android: редактируемый устарел, поэтому вместо него используйте inputType .

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />
M-Разави
источник
android: inputType = "none" сильно отличается от android: редактируемый, попробуйте сами!
Денис Виталий
Если вы собираетесь сделать ваш EditText недоступным для редактирования, я могу предложить использовать виджет TextView вместо EditText, поскольку использование EditText в этом случае кажется бессмысленным.
М-Разави
Ваше предложение не относится к EditText с PopupWindow, см. это изображение, чтобы лучше понять проблему. В этом примере мне нужен внешний вид EditText, но я должен «заблокировать» его, чтобы позволить пользователю изменять значение только с помощью всплывающего окна. Проверьте эту проблему, чтобы увидеть больше мотивации. Это проблема, которая существует с 2009 года.
Денис Виталий
1

Я столкнулся с той же проблемой, но после наблюдения я обнаружил, что android:editable="false"это работает, только когда inputtype ( android:inputType="ANY_VALUE") не указан в Edittext.

Удалите inputType из EditText и используйте editable = false, все работает нормально.

shubomb
источник
0

Я решаю это с помощью диалога.

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });
Жоао Шеледер Нету
источник
0

Краткий ответ: я использовал, android:focusable="false"и это сработало. Прослушивание кликов также работает сейчас.

Анбусельван Рокки
источник
-1

Пытаться

.setInputType(InputType.TYPE_NULL);
Бенмакп Бенмакн
источник
-10

Попробуйте этот код. Он работает в моем проекте, поэтому он будет работать в вашем проекте.

android:editable="false"
user2309848
источник
2
Я могу подтвердить, что это не работает и, более того, использование устаревшего метода не рекомендуется.
Adorjan Princz
1
android: редактируемое на самом деле лучшее решение, если вы хотите, чтобы поле было кликабельным, но не редактируемым, то есть открывало диалоговое окно после нажатия на него.
Яр
не потому что он работает на вашем проекте, он будет на нашем. Очень плохое мышление.
Неоновая Варжа