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.

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

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.


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.


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"

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

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.


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>

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

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"

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.


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

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

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.


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>

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


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.


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.


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


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

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"

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

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.


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

            }
        });

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.



-10

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

android:editable="false"

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