Вимкнення 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.