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

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

  1. это устарело; и
  2. это не сработало.

24 ответов


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

textView.setKeyListener(null);

это работает.

Edit: добавить KeyListener позже, сделать следующее

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

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

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

textView.setKeyListener((KeyListener) textView.getTag());

добавьте это в свой xml-файл EditText:

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

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


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

EditText editText;

editText.setKeyListener(null);

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

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

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

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


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

 android:focusable="false"

повторно включить с Java, если нужно (также одна строка):

editText.setFocusableInTouchMode(true);

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

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

android:enabled="false"

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

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

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


Как вы упомянули 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);

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

        android:focusable="false"

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

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

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

editText.setEnabled(false);

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

editText.setEnabled(true);

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

textView.setInputType( InputType.TYPE_NULL );

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

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

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

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

, которая прекрасно работает.


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

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


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


когда я хочу, чтобы действие не фокусировалось на 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>

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

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

  }

});

С Уважением,

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

Джон Goche


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

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

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

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

editText.setEnabled(true);

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


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


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:enable="true"
android:textIsSelectable="true"
android:inputType="none"

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

удалить inputType из EditText и использовать editable = false, его работа в порядке.


попробовать

.setInputType(InputType.TYPE_NULL);

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

android:editable="false"