Wyłączanie EditText w Androidzie


195

W mojej aplikacji mam tekst EditText, który użytkownik ma tylko do odczytu, a nie do zapisu.

W kodzie ustawiłem android:enabled="false".

Chociaż tło EditText zmieniło się na ciemne, po kliknięciu pojawia się klawiatura i mogę zmienić tekst.

Co powinienem ustawić, aby wyłączyć EditText?


2
Możliwe jest zachowanie zarówno stylu widoku, jak i zachowania przewijania. Aby na EditTextchwilę wyłączyć zachowanie tych właściwości, wystarczy skorzystać UI.setReadOnly(myEditText, true)z tej biblioteki . Jeśli chcesz zreplikować to zachowanie bez biblioteki, sprawdź kod źródłowy tej małej metody.
caw

Odpowiedzi:


245

Wierzę, że poprawne byłoby ustawienie android:editable="false".

A jeśli zastanawiasz się, dlaczego mój link wskazuje na atrybuty TextView, odpowiedź brzmi, ponieważ EditTextdziedziczy po TextView:

EditText to cienki fornir nad TextView, który konfiguruje się do edycji.

Aktualizacja:
jak wspomniano w komentarzach poniżej, editablejest przestarzała ( od poziomu API 3 ). Zamiast tego powinieneś używać inputType(z wartością none).


dzięki Nailuj, niestety nie zadziałało. Po dodaniu sugestii pojawi się klawiatura i istnieje możliwość zmiany tekstu.
Hesam

18
Android: edytowalne jest przestarzałe. android: inputType = "none" należy zamiast tego użyć, ale zawiera błąd i nie działa. Byłoby miło, gdybyśmy wszyscy oznaczali ten problem gwiazdką tutaj: code.google.com/p/android/issues/detail?id=2854
Viktor Brešan

85
editText.setEnabled(false); editText.setInputType(InputType.TYPE_NULL);
Asymptote

28
android:editable="false" android:focusable="false"działa świetnie dla mnie (zapomnij o przestarzałych, myślę, że android: edytowalny nie ma nic wspólnego z Androidem: inputType)
Muhammad Babar

8
Dla wszystkich tych, dla których android: inputType = "none" nie działa, spróbuj: android: inputType = "none" z Androidem: focusable = "false"
Surendra Kumar

161

użyj, EditText.setFocusable(false) aby wyłączyć edycję,
EditText.setFocusableInTouchMode(true)aby umożliwić edycję;


Działa, ale nie jest to dobra praktyka, ponieważ wygląda na to, że można go edytować, ale nie można. Działa dla mnie dobrze, ponieważ mój Widok miał niestandardowe tło, więc daje +1.
kaneda

4
@kaneda. Właściwie to wolę. Nie chcę, żeby moje pudełko było wyszarzone. :)
Doomsknight

1
W Androidzie 4.4 ta opcja zachowuje oryginalny kolor tekstu. Użycie editText.setEnabled(false);spowoduje zmianę koloru tekstu na szary. Jednak błystki nie zmieniają koloru tekstu podczas używania setEnabled, co powoduje, że jest to niespójne.
tbraun

dlaczego nie setFocusable(true)? zobacz ten link, aby zobaczyć różnicę między : setFocusable()i stackoverflow.com/questions/23799064/...setFocusableInTouchMode()
kenju

To naprawdę pasuje do moich potrzeb. Utworzyłem złożony widok niestandardowy z edytowalnym tekstem. Mam problem z dostosowaniem mojego własnego widoku do akceptowania kliknięć, ale nie do edycji, ponieważ uruchamia to okno dialogowe wyboru daty. To rozwiązanie działa, ponieważ nie wyłącza onClickListeners
Neon Warge

64

Możesz wypróbować następującą metodę:

 private void disableEditText(EditText editText) {
    editText.setFocusable(false);
    editText.setEnabled(false);
    editText.setCursorVisible(false);
    editText.setKeyListener(null);
    editText.setBackgroundColor(Color.TRANSPARENT); 
 }

Włączony EditText:

Enabled EditText

Wyłączony Edytuj tekst:

Disabled EditText

To działa dla mnie i mam nadzieję, że ci pomoże.


1
To wygląda jak TextView. To jest takie niesamowite. Tego właśnie szukam.
Yunus

4
W przypadku, gdy ktoś ma ten sam problem z ponownym włączeniem - musisz zadzwonić editText.setFocusableInTouchMode(true)zamiast editText.setFocusable(true).
Dart Dega

61

Użyj tego, aby wyłączyć wprowadzanie danych przez użytkownika

android:focusable="false"

android: editable = "false" Ta metoda jest przestarzała.


1
To powinna być zaakceptowana odpowiedź. Ustawienie typu danych wejściowych na „brak”, jak sugerowano w innych odpowiedziach, nie zawsze działa. Ustawienie „false” włączone zapobiega edycji, ale również przyciemnia tekst, który może być pożądany lub nie.
jerry

36

Aby wyłączyć edycję EditText, myślę, że możemy użyć focusable LUB, enable ale

  1. Za pomocą android:enabled=...lubeditText.setEnabled(...)

    Zmienia również kolor tekstu EditTextna szary.
    Po kliknięciu nie ma żadnego efektu

  2. Za pomocą android:focusable=...lub editText.setFocusable(false)-editText.setFocusableInTouchMode(true)

    Nie zmienia koloru tekstu EditText
    Po kliknięciu podświetla EditTextdolną linię na około kilka milisekund

Wynik

enter image description here


Możesz dodać android:longClickable="false"wraz z, android:focusable="false"aby usunąć tymczasowe podświetlenie po dotknięciu tego widoku. Zapobiega to również pojawianiu się wyskakującego okienka „wybierz wszystko”.
CzarMatt

19

Jak android:editable="false"jest depricated.Możesz użyć InputType TYPE_NULL na EditText

użyj w ten sposób:

editText.setInputType(InputType.TYPE_NULL);

1
Podobała mi się ta odpowiedź, ponieważ nie wyłącza onClickListener w polu.
Harsh Ganatra

co zrobić, jeśli inputType to hasło? TYPE_NULL sprawia, że ​​hasło jest widoczne.
ilyamuromets

17

Jak android:editable="false"przestarzałe wxml

Użyj android:enabled="false"to proste. Po co używać więcej kodu?

Jeśli chcesz java class, możesz również użyć tego programowo

 editText.setEnabled(false);

użyj Androida: enabled = "true" dla enable
android_jain

8

Po prostu:

editText.setEnabled(false);

1
Czym różni się od poprzedniej odpowiedzi (tak jak pytanie)?
Onik,

setFocusable (false) pozwala również ustawić OnClickListener.
Oded Breiner

5

Ustaw poniższe właściwości w klasie:

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

Będzie działać płynnie, jak potrzebujesz.


tylko enabledwystarcza
ateebahmed

5

Aby wyłączyć funkcję EditText, wystarczy użyć:

EditText.setInputType(InputType.TYPE_NULL);

jeśli chcesz to włączyć, możesz użyć:

EditText.setInputType(InputType.TYPE_CLASS_TEXT);

co zrobić, jeśli inputType to hasło? TYPE_NULL sprawia, że ​​hasło jest widoczne.
ilyamuromets

4

Jeśli użyjesz android:editable="false" , Eclipse przypomni ci komunikat „android: edytowalny jest przestarzały: zamiast tego użyj inputType”.

Więc używam android:focusable="false"zamiast tego, działało to dla mnie dobrze.


4
android:editable="false"

jest teraz przestarzałe i używa

 YourEditText.setInputType(InputType.TYPE_NULL);

co zrobić, jeśli inputType to hasło? TYPE_NULL sprawia, że ​​hasło jest widoczne.
ilyamuromets

@ilyamuromets Ta odpowiedź może pomóc stackoverflow.com/a/16720520/7704650 z TYPE_TEXT_VARIATION_PASSWORDŚledź to, aby uzyskać więcej developer.android.com/reference/android/text/InputType
emkarachchi

Chcę wyłączyć wprowadzanie w EditText, gdy klawiatura programowa jest otwarta, a użytkownik próbuje wprowadzić tekst. InputType.TYPE_NULL działa doskonale z isFocusable i isFocusableInTouchMode w wartości false. Ale jeśli inputType pola wejściowego to textPassword, wówczas InputType.TYPE_NULL powoduje wyświetlenie wartości hasła. Jeśli ustawię InputType.TYPE_NULL | InputType.TYPE_TEXT_VARIATION_PASSWORD, wtedy hasło staje się widoczne, a użytkownik może wprowadzić tekst.
ilyamuromets


3

Wyłącz = FOCUS + KLIKNIJ + STRZAŁKA

Wyłączenie widoczności fokusa, kliknięcia i kursora załatwia sprawę.

Oto kod w 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

Spowoduje to wyłączenie tekstu edycji .

editText.setEnabled(false);

I używając tego

editText.setInputType(InputType.TYPE_NULL);

Sprawi, że Edittext nie pokaże klawiatury programowej, ale jeśli jest podłączony do fizycznej klawiatury, pozwoli ci pisać.


co zrobić, jeśli inputType to hasło? TYPE_NULL sprawia, że ​​hasło jest widoczne.
ilyamuromets

2

Korzystam z Google nowo wydanej biblioteki projektowania materiałów. W moim przypadku działa, gdy korzystam z Androida: focusable = "false" i 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

W moim przypadku musiałem EditTextprzewijać tekst, jeśli nie. linii przekracza, maxLinesgdy jest wyłączony. Ta implementacja działała dla mnie idealnie.

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

Wypróbuj ten, działa dobrze dla mnie:

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;
} }

Uwaga: Należy dodać this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); na swojej działalności, albo keyboardbędzie popup na pierwszy raz.


1

Jak niektórzy wspominają o tym, jeśli wyłączysz editText, stanie się szary, a jeśli ustawisz false, ustawiając fokus, kursor będzie wyświetlał.

Jeśli chcesz to zrobić tylko za pomocą XML, to załatwiło sprawę

       <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>

Po prostu dodaję FrameLayout, który pojawia się nad editText, i ustawiam fokus i klikalne, aby editText nie mógł zostać kliknięty.


0

To działa dla mnie:

android: focusable = "false"


2
Czym to się różni od tego, co Sampath Kumar napisał 4 lata temu?
gobrewery 14

0

Z komentarza @ Asymptote na zaakceptowanej odpowiedzi użyj:

myEditText.setEnabled(false);
myEditText.setInputType(InputType.TYPE_NULL);

... a Bob jest twoim wujem.


0

Dziś nadal używam editable="false", ale także zfocusable="false" .

Myślę, że przypadek, w którym musimy uczynić EditText niemożliwym do edycji, jest dlatego, że chcemy zachować jego styl EditText (z tym podkreśleniem, podpowiedzią itp.), Ale akceptuje on inne dane wejściowe zamiast tekstu. Na przykład lista rozwijana.

W takim przypadku konieczne jest EditTextkliknięcie (dlatego enabled="false"nie jest odpowiednie). Ustawiając focusable="false"tę sztuczkę, nadal mogę długo przytrzymać EditText i wkleić na niego własny tekst ze schowka . W zależności od kodu i obsługi może to nawet spowodować awarię aplikacji.

Więc też użyłem editable="false"i teraz wszystko jest świetne, z wyjątkiem ostrzeżenia.


0

możesz użyć, android:focusable="false"ale musisz także wyłączyć kursor, inaczej funkcja kopiuj / wklej nadal działałaby.

więc użyj

android:focusable="false"
android:cursorVisible="false"

0

Istnieje wiele sposobów na osiągnięcie wielu poziomów niepełnosprawności.

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

zapobiega EditTextwyświetlaniu klawiatury - pisanie w tekście. Ale kursor jest nadal widoczny i użytkownik może wkleić tekst.

  • editText.setCursorVisible(false)

ukrywa kursor. Nie jestem pewien, dlaczego chcesz to zrobić. Użytkownik może wprowadzić tekst i wkleić.

  • editText.setKeyListener(null)

Uważam tę drogę za najwygodniejszą. Nie ma sposobu, w jaki użytkownik może wprowadzić tekst, ale widżet nadal działa, OnClickListenerjeśli chcesz uruchomić akcję, gdy użytkownik go dotknie

  • editText.setEnabled(false);

całkowicie wyłącza EditText. Jest dosłownie „tylko do odczytu”, użytkownik nie może wprowadzić w nim żadnego tekstu i (na przykład) OnClickListener nie działa z nim.

Dokumentacja TextEdit


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.