Как сделать 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());

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". Сработало для меня, надеюсь, это сработает и для вас.


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);

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

17

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

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

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


1
Это не имеет значения на всех устройствах, но это должно , согласно документам: developer.android.com/reference/android/widget/…
— caw

12
Прекрасный пример гугл беспорядка
— Яр


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);

7

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

editText.setEnabled(false);

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

editText.setEnabled(true);

5

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

textView.setInputType( InputType.TYPE_NULL );

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

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

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

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

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


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>

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)его, поскольку он предоставляет пользователю визуальную подсказку о том, что элемент управления нельзя редактировать. Одна и та же визуальная подсказка используется всеми отключенными виджетами, и последовательность хорошая.


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();

  }

});

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

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

Джон Гош


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

2

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



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" />

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, все работает нормально.


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();

            }
        });



-10

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

android:editable="false"

2
Я могу подтвердить, что это не работает и, более того, использование устаревшего метода не рекомендуется.
— Adorjan Princz

1
android: редактируемое на самом деле лучшее решение, если вы хотите, чтобы поле было кликабельным, но не редактируемым, то есть открывало диалоговое окно после нажатия на него.
— Яр

не потому что он работает на вашем проекте, он будет на нашем. Очень плохое мышление.
— Неоновая Варжа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.