Jak uniemożliwić edytowanie EditText przez XML w Androidzie?

300

Czy ktoś może mi powiedzieć, jak uniemożliwić EditTextedytowanie za pomocą XML? Próbowałem ustawienie android:editablesię false, ale

  1. jest przestarzałe; i
  2. to nie działało.
Fran Fitzpatrick
źródło
6
Jeśli nie można go edytować, to po co miałbyś EditText? Czy nie wystarczy zwykły TextView? Czy funkcja setEditable () również jest przestarzała?
kiki
4
Dla mnie ma to sens, aby włączyć standardową kopię wklej dla zawartości. Z TextView nie jest to możliwe (przynajmniej nie zachowanie domyślne)
Ixx
1
Korekta: To zły pomysł. W niektórych okolicznościach widok staje się edytowalny lub opcje kopiowania wklejania nie są już wyświetlane. Poszuka innego podejścia.
Ixx
11
W moim przypadku chcę tymczasowo wyłączyć EditText podczas wykonywania zestawu operacji, a następnie włączyć go ponownie po zakończeniu operacji.
Joe Plante,
1
To pytanie dotyczy uzasadnionej obawy. Aby zachować EditTextstyl i umożliwiają przewijanie, korzystanie UI.setReadOnly(myEditText, true)z tej biblioteki . Należy ustawić kilka właściwości, które można sprawdzić w kodzie źródłowym .
caw

Odpowiedzi:

399

Użyj tego prostego kodu:

textView.setKeyListener(null);

To działa.

Edycja: Aby dodać KeyListenerpóźniej, wykonaj następujące czynności

1: ustaw klucz nasłuchiwania na tag textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2: pobierz kluczowy detektor z tagu i ustaw go z powrotem na textView

textView.setKeyListener((KeyListener) textView.getTag());
Kristiono Setyadi
źródło
30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); ustaw go później za pomocą textView.setKeyListener ((KeyListener) textView.getTag ());
Thomas Dignan,
@TomDignan łatwo to zrobić! Mam jedno pytanie. Czy to w jakikolwiek sposób zmienia wartości domyślne wymagane przez KeyListener, na przykład setFocusable()dlatego, że dokument mówi, że domyślna implementacja może zostać zmieniona, jeśli zostanie zmieniona.
Andy
afaik nie, tag powinien być dostępny do użycia
Thomas Dignan,
Hej, twoja sugestia pomogła mi .. dzięki
użytkownik1387035
38
Pytanie dotyczyło ustawienia go za pomocą XML. Dlaczego jest to oznaczone jako rozwiązanie?
Denys Vitali
398

Dodaj to do pliku xml EditText:

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

Będzie działać tak samo jak android:editable="false". Pracowałem dla mnie, mam nadzieję, że to też zadziała dla ciebie.

GalDude33
źródło
3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen,
3
Jeśli chcesz to zrobić w XML ... jaka będzie różnica między nim a TextView ???
Chris Sim
11
Różnica polega na tym, że można go używać zTextInputLayout
ahmadalibaloch
2
Powinno to zostać oznaczone jako rozwiązanie, ponieważ jest to czysto rozwiązanie XML zgodnie z żądaniem w pytaniu.
zgc7009
2
To jest przestarzałe (październik 2018 r.)
Sebastian Paduano
54

Niech Twój Edittext będzie

EditText editText;

editText.setKeyListener(null);

będzie działać, ale po prostu nie słucha klawiszy.

Użytkownik może zobaczyć kursor w tekście edycji.

Możesz spróbować editText.setEnabled(false);

Oznacza to, że użytkownik nie widzi kursora. Po prostu powiedzieć, że się stanie TextView.

Mahendran
źródło
3
Jest poprawny, ponieważ EditText jest podklasą TextView. Jednak użyj editText jako zmiennej zamiast textView.
Joe Plante,
@JoePlante Zmieniono nazwę zmiennej dzięki konstruktywnemu komentarzowi.
Mahendran,
wyświetla się w EditText
stephen
Wyszarzony EditText wskazuje, że jest wyłączony i użytkownik nie może go edytować.
Mahendran
Ustawienie koloru oraz zapobiegnie pojawieniu się szarości. XML: Wypróbuj android: textColor = "@ color / Black" android: enabled = "false"
Czerwone wino
32

Jak wspomniano w innych odpowiedziach, możesz to zrobić, setEnabled(false) ale ponieważ pytasz, jak ustawić go za pomocą XML, oto jak to zrobić.

Dodaj następujący atrybut do EditText:

android:enabled="false"
vida
źródło
4
dokładna odpowiedź na pytanie PO.
SMR
ale ta metoda jest przestarzała
Lalit kumar
2
@Lalitkumar enablednie jest przestarzałe. editablejest.
InsanityOnABun
7
po włączeniu nie możemy również uzyskać dostępu do detektora kliknięć. więc dla mnie to nie jest odpowiedź.
Naveed Ahmad
to jest
ukryty
24

wyłącz z XML (jedna linia):

 android:focusable="false"

włącz ponownie z Java, jeśli to konieczne (także jedna linia):

editText.setFocusableInTouchMode(true);
kouretinho
źródło
Dobra odpowiedź. W ten sposób nadal możesz ustawić wartość editText za pomocą editText.setText („twój tekst”). Ale użytkownik nie może go edytować.
Prakash
17

Sprawili, że „edytowalne” są przestarzałe, ale nie dostarczyły działającego odpowiadającego im w inputType.

Nawiasem mówiąc, czy inputType = "none" ma jakikolwiek wpływ? Korzystanie z niego lub nie nie robi żadnej różnicy, o ile widzę.

Na przykład domyślny editText ma postać pojedynczej linii. Ale musisz wybrać inputType, aby był to pojedynczy wiersz. A jeśli wybierzesz „brak”, nadal będzie wielowierszowy.

Timuçin
źródło
1
To nie robi różnicy na wszystkich urządzeniach, ale powinno , zgodnie z dokumentami: developer.android.com/reference/android/widget/…
caw
12
Piękny przykład bałaganu w Google
Yar
14

Ta kombinacja działała dla mnie:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>
Massimo Fazzolari
źródło
13

Jak wspomniałeś android: edytowalne jest przestarzałe. android: inputType = "none" należy zamiast tego użyć, ale nie działa z powodu błędu ( https://code.google.com/p/android/issues/detail?id=2854 )

Ale możesz osiągnąć to samo, korzystając z ustawiania ostrości.

Przez XML:

<EditText ...
        android:focusable="false" 
</EditText>

Z kodu:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);
Adorjan Princz
źródło
Dzięki uprzejmości google błąd będzie można podzielić na dwa różne scenariusze: 1.) Zostanie naprawiony, ale po 6 latach 2.) Nigdy nie zostanie naprawiony, po prostu opracują nową wersję Androida.
Neon Warge,
12

jeśli chcesz go kliknąć, ale nie chcesz go edytować, spróbuj:

        android:focusable="false"
Kai Wang
źródło
8

Po prostu użyj android:enabled="false". Spowoduje to również pojawienie się tego, EditTextco sprawi, że będzie wyglądać na niemożliwy do edycji.

Shahid Sarwar
źródło
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" />

i użyj następujących:

txtDate.setKeyListener(null);
askimp
źródło
7

Jeśli chcesz to zrobić w kodzie Java, użyj tego wiersza, aby go wyłączyć:

editText.setEnabled(false);

Aby to umożliwić:

editText.setEnabled(true);
użytkownik3185897
źródło
5

Próbowałem zrobić:

textView.setInputType( InputType.TYPE_NULL );

co powinno działać, ale dla mnie nie.

Skończyłem z tym kodem:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

co działa idealnie.

Saric
źródło
4

Kiedy chcę, aby aktywność nie skupiała się na tekście edycji, a także nie wyświetlała klawiatury po kliknięciu, to działało dla mnie.

Dodawanie atrybutów do głównego układu

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

a następnie pole EditText

android:focusable="false"
android:focusableInTouchMode="false"

Oto przykład:

<?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>
Woppi
źródło
3

Oprócz @mahe madi możesz również spróbować tego

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

Ta metoda ukryje kursor, utraci fokus i, co ważniejsze, ustawi kolor tekstu na czarny zachowując się jak TextView.

Aby cofnąć Powrót do editText, po prostu zrób to, aby uzyskać wszystkie właściwości EditText.

editText.setEnabled(true);

Mam nadzieję, że to pomoże :)

Superuser
źródło
3

Możesz użyć, android:editable="false"ale naprawdę radzę ci użyć, setEnabled(false)ponieważ zapewnia wizualną wskazówkę dla użytkownika, że ​​formant nie może być edytowany. Ten sam wizualny sygnał jest używany przez wszystkie wyłączone widżety, a spójność jest dobra.

jclafuente
źródło
3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Atrybut „longClickable” wyłącza akcje długie naciśnięcia, które powodują wyświetlanie opcji „Wklej” i lub „Zaznacz wszystko” jako podpowiedzi.

Radhey
źródło
2

Próbowałem następujące:

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();

  }

});

ale problem polegał na tym, że jeśli tekst edycji jest pierwszy w formularzu, to zostaje on zogniskowany, a kod pickCode (), który uruchamia nowe działanie, jest natychmiast nazywany. Więc zmodyfikowałem kod w następujący sposób i wydaje się, że działa całkiem dobrze (z wyjątkiem tego, że nie mogę ustawić fokusu na edycji tekstu, ale nie muszę):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Z poważaniem,

Komentarze mile widziane,

John Goche

johngoche9999
źródło
1
Wydaje się, że działa dobrze, ale czy nie jest łatwiej używać TextView, który wygląda jak EditText (using: style = "@ android: style / Widget.EditText")?
programista Androida
2

Używam EditText.setFocusable(false)i ustawiam ponownie, jeśli chcę edytować.

nobjta_9x_tq
źródło
2

Spróbuj tego :

android:inputType="none"
Rutvik
źródło
2

W ten sposób zrobiłem to za mnie, mogę wybierać i kopiować do schowka, ale nie mogę modyfikować ani wklejać.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"
Lew
źródło
1

android: edytowalne jest przestarzałe, więc zamiast tego użyj 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" />
M-Razavi
źródło
android: inputType = "none" różni się znacznie od Androida: edytowalny, spróbuj sam!
Denys Vitali
Jeśli chcesz, aby Twój EditText nie był edytowalny, czy mogę zasugerować użycie widgetu TextView zamiast EditText, ponieważ użycie EditText wydaje się w tym przypadku bezcelowe.
M-Razavi
Twoja sugestia nie dotyczy edycji tekstu z PopupWindow, zobacz ten obraz, aby lepiej zrozumieć problem. W tym przykładzie chcę wyglądać jak EditText, ale muszę go „zablokować”, aby użytkownik mógł zmienić wartość tylko za pomocą okna podręcznego. Sprawdź ten problem, aby zobaczyć więcej motywacji. Jest to problem, który pojawia się od 2009 roku.
Denys Vitali
1

android:editable="false"Napotkałem ten sam problem, ale po obserwacji stwierdziłem, że działa on tylko wtedy, gdy inputtype ( android:inputType="ANY_VALUE") nie jest podane w Edittext.

Usuń inputType z EditText i użyj editable = false, działa poprawnie.

shubomb
źródło
0

Rozwiązuję to za pomocą okna dialogowego.

    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();

            }
        });
João Scheleder Neto
źródło
0

Krótka odpowiedź: użyłem android:focusable="false"i zadziałało. Słuchanie za pomocą kliknięcia również działa teraz.

Anbuselvan Rocky
źródło
-1

Próbować

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
źródło
-10

Wypróbuj ten kod. Działa w moim projekcie, więc zadziała w twoim projekcie.

android:editable="false"
użytkownik2309848
źródło
2
Mogę potwierdzić, że to nie działa, a ponadto nie jest zalecane stosowanie metody amortyzacji.
Adorjan Princz
1
android: edytowalne jest w rzeczywistości najlepszym rozwiązaniem, jeśli chcesz, aby pole było klikalne, ale nie można go edytować, tj. aby otworzyć okno dialogowe po kliknięciu.
Yar
nie dlatego, że działa na twój projekt, ale na nasz. Bardzo złe myślenie.
Neon Warge