Як зробити 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)з цієї бібліотеки . Необхідно встановити кілька властивостей, які ви можете перевірити у вихідному коді .
— каре

Відповіді:


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

Привіт, ур пропозиція допомогла мені .. Дякую
— user1387035

38
Питання полягало у встановленні його через XML , чому це позначено як рішення?
— Denys Vitali

398

Додайте це до свого файлу xml EditText:

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

Це зробить такий же ефект, як і android:editable="false". Працював для мене, сподіваюсь, він буде працювати і для вас.


3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
— Джек Францен

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 Змінено ім'я змінної спасибі за конструктивний коментар.
— Mahendran

це затемнюється в EditText
— Стівен

Сірий EditText вказує на те, що його вимкнено і користувач не може його редагувати.
— Mahendran

Налаштування кольору так само, як і запобіжить сірого вигляду. XML: Спробуйте android: textColor = "@ color / Black" android: enable = "false"
— Червоне вино

32

Як згадується в інших відповідях, ви можете зробити це, setEnabled(false) але оскільки ви запитуєте, як його встановити через XML, ось як це зробити.

Додайте такий атрибут до свого EditText:

android:enabled="false"

4
точна відповідь на питання ОП.
— SMR

але цей метод застарів
— Лалит кумар

2
@Lalitkumar enabledне застаріло. editableє.
— InsanityOnABun

7
включивши, ми також не можемо отримати доступ до слухача кліків. так що для мене це не відповідь.
— Naveed Ahmad

це прихований текст :(
— 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
Прекрасний приклад Google бардак
— ЯР


13

Як ви вже згадували Android: редагування застаріло. android: inputType = "none" слід використовувати замість цього, але він не працює через помилку ( https://code.google.com/p/android/isissue/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>

3

Окрім @mahe madi, ви можете спробувати і це

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

Цей метод приховає курсор, втратить фокус і важливіше встановить колір тексту на чорний, поводячись як TextView.

А для повернення Back to editText просто зробіть це, щоб отримати всі властивості EditText.

editText.setEnabled(true);

Сподіваюся, що це допомагає :)


3

Ви можете використовувати, android:editable="false"але я б дуже радив вам використовувати, setEnabled(false)оскільки це надає візуальну підказку для користувача, що елемент керування не може бути змінений. Один і той же візуальний кий використовується для всіх відключених віджетів, а послідовність - це добре.


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Атрибут "longClickable" відключає тривалі дії натискання, які спричиняють показ "Вставити" та "Вибрати все" як підказки.


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")?
— андроїд розробник

2

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



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: можна редагувати, спробуйте самі!
— Denys Vitali

Якщо ви збираєтеся зробити EditText не редагованим, я можу запропонувати використовувати віджет TextView замість EditText, оскільки використання EditText здається безглуздим у цьому випадку.
— M-Razavi

Ваша пропозиція не стосується EditText з PopupWindow, перегляньте це зображення, щоб краще зрозуміти проблему. У цьому прикладі я хочу виглядати EditText, але мені потрібно "заблокувати його", щоб дозволити користувачеві змінювати значення просто за допомогою popupwindow. Перевірте це питання, щоб побачити більше мотивації. Це проблема, яка існує з 2009 року.
— Denys Vitali

1

Я зіткнувся з тією ж проблемою, але після спостереження я виявив, що android:editable="false"працює лише тоді, коли inputtype ( android:inputType="ANY_VALUE") не задано в Edittext.

Видаліть inputType з EditText і використовуйте редагуваний = 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();

            }
        });

0

Коротка відповідь: я використовував android:focusable="false"і це спрацювало. Прослуховування клацань також працює зараз.



-10

Спробуйте цей код. Це працює в моєму проекті, тому воно буде працювати у вашому проекті.

android:editable="false"

2
Я можу підтвердити, що це не працює, і що більше використовувати метод амортизації, не рекомендується.
— Адорян Принч

1
android: редагований насправді є найкращим рішенням, якщо ви хочете, щоб поле було доступним для натискання, але не для редагування, тобто для відкриття діалогового вікна після натискання на нього.
— Яр

не тому, що він працює над вашим проектом, це буде на нашому. Дуже погане мислення.
— Неонова війна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.