Вимкнення EditText в Android


195

У своїй програмі у мене є EditText, що користувач має доступ лише для читання, а не для запису.

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

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

Що потрібно встановити, щоб відключити EditText?


2
Можна зберегти як стиль перегляду, так і поведінку прокрутки. Щоб відключити EditText, зберігаючи при цьому ці властивості, просто використовувати UI.setReadOnly(myEditText, true)з цієї бібліотеки . Якщо ви хочете повторити цю поведінку без бібліотеки, перегляньте вихідний код цього маленького методу.
— каре

Відповіді:


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: inputType)
— Muhammad

8
Для всіх тих, для кого android: inputType = "none" не працює, спробуйте: android: inputType = "none" з android: focusable = "false"
— Surendra Kumar

161

використовувати EditText.setFocusable(false) для відключення редагування
EditText.setFocusableInTouchMode(true)для включення редагування;


Це працює, але це не є хорошою практикою, оскільки представлення виглядає так, що воно може бути редаговане, але не може. Для мене добре працювало, тому що в "Моєму перегляді" було власне тло, тому +1.
— kaneda

4
@kaneda. Я справді віддаю перевагу цьому. Я не хочу, щоб мій ящик був сірим. :)
— Doomsknight

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

чому ні setFocusable(true)? ця посилання на різницю між setFocusable()і setFocusableInTouchMode(): stackoverflow.com/questions/23799064 / ...
— kenju

Це дійсно відповідає моїм потребам. Я створив складений спеціальний вид із 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).
— Дарт Дега

61

Використовуйте це, щоб вимкнути введення користувача

android:focusable="false"

android: editable = "false" Цей метод є застарілим.


1
Це має бути прийнятою відповіддю. Встановлення типу введення на "немає", як пропонується в інших відповідях, не завжди (завжди) працює. Якщо встановлено параметр "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"щоб видалити тимчасову підсвітку, торкаючись цього виду. Це також запобігає появі спливаючого вікна "вибрати всіх".
— CzarMatt

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: enable = "true" для enable
— android_jain


5

Встановіть нижче властивості в класі:

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

Він буде працювати плавно, як вам потрібно.


лише enabledбуло достатньо
— атеебахмед

5

Щоб відключити функціональність EditText, просто використовуйте:

EditText.setInputType(InputType.TYPE_NULL);

якщо ви хочете якось включити це, ви можете використовувати:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

що робити, якщо inputType - пароль? TYPE_NULL робить видимим пароль.
— ілямуромець

4

якщо ви використовуєте android:editable="false", eclipse нагадає вам це повідомлення "android: редагується застаріло: замість цього введіть 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 в хибному значенні. Але якщо введенням поля вводу є textPassword, то InputType.TYPE_NULL зробить значення пароля видимим. Якщо я встановив InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD, тоді пароль також стає видимим і користувач може ввести текст.
— ілямуромець


3

Це зробить ваш текст редагування вимкненим .

editText.setEnabled(false);

І використовуючи це

editText.setInputType(InputType.TYPE_NULL);

Просто змусить ваш редакційний текст не показувати вашу програмну клавішу, але якщо він підключений до фізичної клавіатури, він дозволить вам набрати текст.


що робити, якщо inputType - пароль? TYPE_NULL робить видимим пароль.
— ілямуромець

3

Вимкнути = FOCUS + CLICK + CURSOR

Вимкнення фокуса, клацання та видимості курсору робить для мене хитрість.

Ось код у 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, він стане сірим, а якщо встановлено фокусируемую помилку, курсор відображатиметься.

Якщо ви хочете зробити це лише з 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

Це працює для мене:

android: focusable = "false"


2
Чим це відрізняється від того, що Сампат Кумар опублікував 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.