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