Отключение EditText в Android


195

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

В коде я установил android:enabled="false".

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

Что я должен установить, чтобы отключить EditText?


2
Можно сохранить как стиль представления, так и режим прокрутки. Чтобы отключить EditTextсохранение этих свойств, просто используйте UI.setReadOnly(myEditText, true)из этой библиотеки . Если вы хотите повторить это поведение без библиотеки, проверьте исходный код этого небольшого метода.
— Caw

Ответы:


245

Я считаю, что правильно будет установить android:editable="false".

И если вам интересно, почему моя ссылка указывает на атрибуты TextView, вы ответите, потому что EditTextнаследует от TextView:

EditText - это тонкая оболочка над TextView, которая настраивается для редактирования.

Обновление:
как упомянуто в комментариях ниже, editableне рекомендуется ( начиная с уровня API 3 ). Вы должны вместо этого использовать inputType(со значением none).


спасибо Nailuj, к сожалению, это не сработало. После добавления вашего предложения клавиатура выскакивает и появляется возможность изменить текст.
— Хесам

18
Android: редактируемый устарел. Вместо этого следует использовать android: inputType = "none", но он содержит ошибку и не работает. Было бы хорошо, если бы мы все отметили
— Виктор Брешан,

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
— Асимптот

28
android:editable="false" android:focusable="false"отлично работает для меня (забудьте об устаревшем, я думаю, android: редактируемый не имеет ничего общего с android: inputType)
— Мухаммед Бабар

8
Для всех тех, для кого не работает android: inputType = "none", попробуйте: android: inputType = "none" с android: focusable = "false"
— Сурендра Кумар

162

используйте EditText.setFocusable(false) для отключения редактирования,
EditText.setFocusableInTouchMode(true)чтобы включить редактирование;


Это работает, но это не очень хорошая практика, потому что вид может быть редактируемым, но не может. У меня все работало нормально, потому что у моего View был собственный фон, поэтому +1.
— Канеда

4
@kaneda. Я на самом деле предпочитаю это. Я не хочу, чтобы моя коробка была серой. :)
— Doomsknight

1
В Android 4.4 эта опция сохраняет исходный цвет текста. Использование editText.setEnabled(false);изменит цвет текста на серый. Однако блесны не изменяют цвет текста при использовании setEnabled, что делает его непоследовательным.
— tbraun

почему нет setFocusable(true)? см. эту ссылку, чтобы узнать разницу между setFocusable()и setFocusableInTouchMode(): stackoverflow.com/questions/23799064/…
— кендзю

Это действительно соответствует моим потребностям. Я создал составное пользовательское представление с EditText внутри. У меня возникла проблема с тем, чтобы пользовательское представление просто принимало клики, но не редактировалось, так как это запускает диалог выбора даты. Это решение работает, так как оно не отключает onClickListeners
— Neon Warge

64

Вы можете попробовать следующий метод:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

Включен EditText:

Включен EditText

Отключено EditText:

Отключено EditText

Это работает для меня и надеюсь, что это поможет вам.


1
Это похоже на TextView. Это так потрясающе. Это то, что я ищу.
— Юнус

4
В случае, если у кого-то есть такая же проблема с разрешением возврата - вам нужно позвонить, editText.setFocusableInTouchMode(true)а не editText.setFocusable(true).
— Дарт Дега

62

Используйте это, чтобы отключить пользовательский ввод

android:focusable="false"

android: editable = "false" Этот метод устарел.


1
Это должен быть принятый ответ. Установка типа ввода 'none', как предлагается в других ответах, не всегда работает. Если для параметра установлено значение «false», то это не только редактирует, но и затемняет текст, который может быть или не быть желательным.
— Джерри

36

Для отключения редактирования EditText, я думаю, мы можем использовать focusable ИЛИ, enable но

  1. Используя android:enabled=...илиeditText.setEnabled(...)

    Он также меняет цвет текста EditTextна серый.
    При нажатии это не имеет никакого эффекта

  2. Используя android:focusable=...или editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Он не меняет цвет текста. EditText
    При щелчке выделяет EditTextнижнюю строку в течение нескольких миллисекунд.

Вывод

введите описание изображения здесь


Вы можете добавить android:longClickable="false"вместе с , android:focusable="false"чтобы удалить временную подсветку при касании этой точки зрения. Это также предотвращает появление всплывающего окна «Выбрать все».
— ЦарМатт

19

Как android:editable="false"не рекомендуется. Вы можете использовать InputType TYPE_NULL на EditText

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

editText.setInputType(InputType.TYPE_NULL);

1
Понравился этот ответ, потому что он не отключает onClickListener на поле.
— Суровая

Что делать, если inputType пароль? TYPE_NULL делает пароль видимым.
— ильямуромец

17

Как android:editable="false"не рекомендуетсяxml

Использовать android:enabled="false"это просто. Зачем использовать больше кода?

Если вы хотите, java classвы также можете использовать это программно

 editText.setEnabled(false);

использовать android: enabled = "true" для включения
— android_jain


5

Установите ниже свойства в классе:

editText.setFocusable(false);
editText.setEnabled(false);

Это будет работать так, как вам нужно.


только enabledбыло достаточно
— ateebahmed

5

Чтобы отключить функциональность EditText, просто используйте:

EditText.setInputType(InputType.TYPE_NULL);

если вы хотите включить его каким-либо образом, вы можете использовать:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

Что делать, если inputType пароль? TYPE_NULL делает пароль видимым.
— ильямуромец

4

если вы используете android:editable="false" , eclipse будет напоминать вам это сообщение «android: editable устарела: используйте вместо inputType».

Таким образом, я использую android:focusable="false"вместо этого, это работало хорошо для меня.


4
android:editable="false"

сейчас устарела и использовать

 YourEditText.setInputType(InputType.TYPE_NULL);

Что делать, если inputType пароль? TYPE_NULL делает пароль видимым.
— ильямуромец

@ilyamuromets Этот ответ может помочь stackoverflow.com/a/16720520/7704650 с TYPE_TEXT_VARIATION_PASSWORDСледуйте за этим для большего количества developer.android.com/reference/android/text/InputType
— emkarachchi

Я хочу отключить ввод в EditText, когда открыта программная клавиатура и пользователь пытается ввести текст. InputType.TYPE_NULL прекрасно работает с isFocusable и isFocusableInTouchMode со значением false. Но если inputType поля ввода имеет значение textPassword, тогда InputType.TYPE_NULL сделает значение пароля видимым. Если я установлю InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD, тогда пароль также становится видимым, и пользователь может вводить текст.
— ильямуромец


3

Это сделает ваш текст редактирования отключенным .

editText.setEnabled(false);

И с помощью этого

editText.setInputType(InputType.TYPE_NULL);

Просто заставит ваш Edittext не показывать вашу программную клавиатуру, но если он подключен к физической клавиатуре, он позволит вам печатать.


Что делать, если inputType пароль? TYPE_NULL делает пароль видимым.
— ильямуромец

3

Отключить = ФОКУС + ЩЕЛЧОК + КУРСОР

Отключение фокуса, щелчка и видимости курсора помогает мне.

Вот код в XML

<EditText
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:cursorVisible="false"
    android:clickable="false"
    />

2

Я использую недавно выпущенную Google библиотеку материалов. В моем случае это работает, когда я использую android: focusable = "false" и android: cursorVisible = "false"

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/to_time_input_layout"
                    app:endIconMode="custom"
                    app:endIconDrawable="@drawable/ic_clock"
                    app:endIconContentDescription="ToTime"
                    app:endIconTint="@color/colorAccent"
                    style="@style/OutlinedEditTextStyle"
                    android:hint="To Time">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/to_time_edit_text"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false"
                        android:cursorVisible="false" />

</com.google.android.material.textfield.TextInputLayout>

1

В моем случае мне нужно EditTextбыло прокрутить текст, если нет. из строк превышает maxLinesкогда его отключено. Эта реализация отлично сработала для меня.

private void setIsChatEditTextEditable(boolean value)
{
    if(value)
    {
        mEdittext.setCursorVisible(true);
        mEdittext.setSelection(chat_edittext.length());
       // use new EditText(getApplicationContext()).getKeyListener()) if required below
        mEdittext.setKeyListener(new AppCompatEditText(getApplicationContext()).getKeyListener());  
    }
    else
    {
        mEdittext.setCursorVisible(false);
        mEdittext.setKeyListener(null);
    }
}

1

Попробуйте это, отлично работает для меня:

public class CustomEdittext extends EditText {

Boolean mIsTextEditor=true;
public CustomEdittext(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
public boolean onCheckIsTextEditor() {
    // TODO Auto-generated method stub
    return mIsTextEditor;
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    mIsTextEditor=false;
    Boolean mOnTouchEvent=super.onTouchEvent(event);
    mIsTextEditor=true;     
    return mOnTouchEvent;
} }

Примечание: Вы должны добавить this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); в вашей деятельности , либо keyboardбудет всплывать в первый раз.


1

Как отмечают некоторые ответы, если вы отключите editText, он станет серым, а если вы установите фокусируемое значение false, курсор отобразится.

Если вы хотели бы сделать это только с XML, это сделало свое дело

       <YourFloatLabel
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <EditText
                android:id="@+id/view_ads_search_select"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusable="true"
                android:clickable="true"/>  
       </YourFloatLabel>

Я просто добавляю FrameLayout, появляющийся над editText, и устанавливаю его фокусируемым и активируемым, чтобы на editText нельзя было кликать.


0

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

андроид: фокусируемые = «ложь»


2
Чем это отличается от того, что Sampath Kumar опубликовал 4 года назад?
— gobrewers14

0

Из комментария @ Asymptote о принятом ответе используйте:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... а Боб твой дядя.


0

Сегодня я все еще использую editable="false", но и сfocusable="false" .

Я думаю, что мы должны сделать EditText недоступным для редактирования, потому что мы хотим сохранить его стиль EditText (с этим подчеркиванием, подсказкой и т. Д.), Но он принимает другие входные данные вместо текста. Например выпадающий список.

В таком случае нам нужно иметь EditTextкликабельность (поэтому enabled="false"не подходит). Настройка focusable="false"делает этот трюк, однако, я все еще могу долго удерживать EditText и вставить свой собственный текст на него из буфера обмена . В зависимости от вашего кода и обработки это может даже привести к сбою приложения.

Так что я тоже пользовался editable="false"и сейчас все отлично, кроме предупреждения.


0

Вы можете использовать, android:focusable="false"но также необходимо отключить курсор, иначе функция копирования / вставки все равно будет работать.

так что пользуйтесь

android:focusable="false"
android:cursorVisible="false"

0

Есть несколько способов достижения нескольких уровней инвалидности.

  • editText.setShowSoftInputOnFocus(false); и editText.setFocusable

запрещает EditTextпоказ клавиатуры - написание текста. Но курсор все еще виден, и пользователь может вставить некоторый текст.

  • editText.setCursorVisible(false)

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

  • editText.setKeyListener(null)

Я считаю этот способ наиболее удобным. Пользователь не может вводить текст, но виджет по-прежнему работает, OnClickListenerесли вы хотите инициировать действие, когда пользователь касается его.

  • editText.setEnabled(false);

полностью отключает EditText. Он буквально «только для чтения», пользователь не может вводить в него текст и (например) OnClickListener не работает с ним.

Документация TextEdit


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