Отключение 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.