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?

Hesam
źródło
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).

juliański
źródło
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ę;

Sean Android
źródło
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.

Maksym Kalin
źródło
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.

Sampath Kumar
źródło
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

Phan Van Linh
źródło
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);
Bhargav Thanki
źródło
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);
android_jain
źródło
użyj Androida: enabled = "true" dla enable
android_jain
8

Po prostu:

editText.setEnabled(false);
Oded Breiner
źródło
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.

Ranga
źródło
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);
hypergogeta
źródło
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.

wangzhengyi
źródło
4
android:editable="false"

jest teraz przestarzałe i używa

 YourEditText.setInputType(InputType.TYPE_NULL);
emkarachchi
źródło
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

Użyj TextViewzamiast tego.

cx0der
źródło
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"
    />
Rohit Singh
źródło
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ć.

Mark Joshua Fajardo
źródło
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>
Aminul Haque Aome
źródło
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);
    }
}
Rishabh876
źródło
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.

Favas Kv
źródło
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.

Vodet
źródło
0

To działa dla mnie:

android: focusable = "false"

Annie
źródło
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.

Tom Howard
źródło
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.

Sira Lam
źródło
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"
M.Usman
źródło
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

Głęboki błękit
źródło
0

Ustaw to w kodzie XML, działa.

android: focusableInTouchMode = "false"

Sujeet Kumar Gupta
źródło