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

195

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

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

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

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

Hesam
источник
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_jain
источник
использовать android: enabled = "true" для включения
android_jain
8

Просто:

editText.setEnabled(false);
Одед Брейнер
источник
1
Чем он отличается от предыдущего ответа (как вопрос)?
Оник
setFocusable (false) также позволяет вам установить OnClickListener.
Одед Брейнер
5

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

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

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

Ранг
источник
только enabledбыло достаточно
ateebahmed
5

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

EditText.setInputType(InputType.TYPE_NULL);

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

EditText.setInputType(InputType.TYPE_CLASS_TEXT);
hypergogeta
источник
Что делать, если inputType пароль? TYPE_NULL делает пароль видимым.
ильямуромец
4

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

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

wangzhengyi
источник
4
android:editable="false"

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

 YourEditText.setInputType(InputType.TYPE_NULL);
emkarachchi
источник
Что делать, если 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

Используйте TextViewвместо этого.

cx0der
источник
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);
    }
}
Rishabh876
источник
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 нельзя было кликать.

Vodet
источник
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"
M.Usman
источник
0

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

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

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

  • editText.setCursorVisible(false)

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

  • editText.setKeyListener(null)

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

  • editText.setEnabled(false);

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

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

Темно-синий
источник
0

Установите это в своем коде XML, это работает.

андроид: focusableInTouchMode = "ложь"

Суджит Кумар Гупта
источник