Як зробити 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.