Wie kann man EditText in Android nicht über XML bearbeiten?


300

Kann mir jemand sagen, wie man eine EditTextnicht über XML bearbeitbare macht? Ich habe versucht Einstellung android:editablezu false, aber

  1. es ist veraltet; und
  2. es hat nicht funktioniert.

6
Wenn nicht bearbeitbar, warum benötigen Sie den EditText? Wird die Verwendung einer normalen Textansicht nicht ausreichen? Und ist die Funktion setEditable () ebenfalls veraltet?
Kiki

4
Für mich ist dies sinnvoll, um das Standard-Kopieren und Einfügen für den Inhalt zu ermöglichen. Mit einer TextView ist es nicht möglich (zumindest nicht Standardverhalten)
Ixx

1
Korrektur: Es ist eine schlechte Idee. Unter bestimmten Umständen kann die Ansicht bearbeitet werden, oder die Optionen zum Kopieren und Einfügen werden nicht mehr angezeigt. Wird nach einem anderen Ansatz suchen.
Ixx

11
In meinem Fall möchte ich einen EditText vorübergehend deaktivieren, während eine Reihe von Vorgängen ausgeführt wird, und ihn dann wieder aktivieren, wenn der Vorgang abgeschlossen ist.
Joe Plante

1
Bei dieser Frage handelt es sich um ein berechtigtes Anliegen. Um den zu wahren EditTextStil und erlaubt eine Rolle, die Verwendung UI.setReadOnly(myEditText, true)von dieser Bibliothek . Es müssen einige Eigenschaften festgelegt werden, die Sie im Quellcode überprüfen können .
Caw

Antworten:


399

Verwenden Sie diesen einfachen Code:

textView.setKeyListener(null);

Es klappt.

Bearbeiten: Um KeyListenerspäter hinzuzufügen , gehen Sie wie folgt vor

1: Setzen Sie den Key Listener auf das Tag von textView

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

2: Holen Sie sich den Key Listener vom Tag und setzen Sie ihn zurück auf textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag (textView.getKeyListener ()); Setzen Sie es später mit textView.setKeyListener ((KeyListener) textView.getTag ()) zurück.
Thomas Dignan

@ TomDignan tolle Möglichkeit einfach dazu! Ich habe eine Frage. Ändert dies in irgendeiner Weise die von KeyListener benötigten Standardwerte, z. B. setFocusable()weil das Dokument angibt, dass die Standardimplementierung möglicherweise geändert wird, wenn sie geändert wird.
Andy

afaik nein, das tag sollte für dich verfügbar sein
Thomas Dignan

Hey, dein Vorschlag hat mir geholfen. Danke
user1387035

38
Die Frage war, ob es über XML eingestellt werden soll. Warum ist dies als Lösung gekennzeichnet?
Denys Vitali

398

Fügen Sie dies Ihrer EditText-XML-Datei hinzu:

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

Es wird den gleichen Effekt haben wie android:editable="false". Hat für mich gearbeitet, hoffe es funktioniert auch für dich.


3
notes.setKeyListener (null); notes.setClickable (false); notes.setCursorVisible (false); notes.setFocusable (false); notes.setFocusableInTouchMode (false);
Jack Franzen

3
Wenn Sie es in XML tun möchten ... was wird der Unterschied zwischen ihm und TextView sein?
Chris Sim

11
Der Unterschied ist, dass es mitTextInputLayout
ahmadalibaloch

2
Dies sollte als Lösung markiert werden, da es sich um eine reine XML-Lösung handelt, wie in der Frage gefordert.
zgc7009

2
Dies ist veraltet (Oktober 2018)
Sebastian Paduano

54

Lass deinen Edittext sein

EditText editText;

editText.setKeyListener(null);

wird funktionieren, aber es hört einfach nicht auf Tasten.

Der Benutzer kann einen Cursor auf dem Edittext sehen.

Du kannst es versuchen editText.setEnabled(false);

Das bedeutet, dass der Benutzer den Cursor nicht sehen kann. Einfach zu sagen, es wird TextView.


3
Es ist richtig, da EditText eine Unterklasse von TextView ist. Verwenden Sie jedoch editText als Variable anstelle von textView.
Joe Plante

@JoePlante Geänderter Variablenname danke für konstruktiven Kommentar.
Mahendran

Dies grau den EditText
Stephen

Grayed EditText zeigt an, dass es deaktiviert ist und der Benutzer es nicht bearbeiten kann.
Mahendran

Durch Einstellen der Farbe sowie wird das graue Erscheinungsbild verhindert. XML: Versuchen Sie android: textColor = "@ color / Black" android: enabled = "false"
Rotwein

32

Wie in anderen Antworten erwähnt, können Sie eine setEnabled(false) Aktion ausführen. Da Sie jedoch fragen, wie Sie sie über XML festlegen möchten, finden Sie hier eine Vorgehensweise.

Fügen Sie Ihrem Attribut das folgende Attribut hinzu EditText:

android:enabled="false"

4
genaue Antwort auf die OP-Frage.
SMR

aber diese Methode veraltet
Lalit Kumar

2
@Lalitkumar enabledist nicht veraltet. editableist.
InsanityOnABun

7
Durch Aktivieren können wir auch nicht auf den Klick-Listener zugreifen. Für mich ist es also nicht die Antwort.
Naveed Ahmad

Dies ist Text verbergen :(
Chego

24

Deaktivieren von XML (eine Zeile):

 android:focusable="false"

ggf. von Java aus wieder aktivieren (auch eine Zeile):

editText.setFocusableInTouchMode(true);

Gute Antwort. Auf diese Weise können Sie den editText-Wert weiterhin mit editText.setText ("Ihr Text") festlegen. Der Benutzer kann es jedoch nicht bearbeiten.
Prakash

17

Sie haben "bearbeitbar" veraltet gemacht, aber keine entsprechende in inputType bereitgestellt.

Hat inputType = "none" übrigens irgendwelche Auswirkungen? Es zu benutzen oder nicht macht meines Erachtens keinen Unterschied.

Beispielsweise wird der Standard-editText als einzeilig bezeichnet. Sie müssen jedoch einen Eingabetyp auswählen, damit er einzeilig ist. Und wenn Sie "keine" auswählen, ist es immer noch mehrzeilig.


1
Es macht keinen Unterschied auf allen Geräten, aber es sollte laut den Dokumenten: developer.android.com/reference/android/widget/…
caw

12
Ein schönes Beispiel für Google Mess
Yar

14

Diese Kombination hat bei mir funktioniert:

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

13

Wie du schon erwähnt hast android: editierbar ist veraltet. android: inputType = "none" sollte stattdessen verwendet werden, funktioniert jedoch aufgrund eines Fehlers nicht ( https://code.google.com/p/android/issues/detail?id=2854 ).

Aber Sie können das Gleiche erreichen, indem Sie fokussierbar verwenden.

Über XML:

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

Aus dem Code:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

Mit freundlicher Genehmigung von Google wird der Fehler in zwei verschiedene Szenarien fallen: 1.) Es wird behoben, aber nach 6 Jahren 2.) Es wird nie behoben, sie werden nur eine neue Version von Android entwickeln.
Neon Warge

12

Wenn Sie darauf klicken, es aber nicht bearbeiten möchten, versuchen Sie Folgendes:

        android:focusable="false"

8

Einfach benutzen android:enabled="false". Dies verleiht dem auch ein Erscheinungsbild, das EditTextes nicht bearbeitbar erscheinen lässt.


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

und verwenden Sie Folgendes:

txtDate.setKeyListener(null);

7

Wenn Sie es in Java-Code tun möchten, verwenden Sie einfach diese Zeile, um es zu deaktivieren:

editText.setEnabled(false);

Und das, um es zu ermöglichen:

editText.setEnabled(true);

5

Ich habe versucht zu tun:

textView.setInputType( InputType.TYPE_NULL );

was funktionieren sollte, aber für mich nicht.

Ich habe mit diesem Code fertig:

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

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

das funktioniert perfekt.


4

Wenn ich möchte, dass sich eine Aktivität nicht auf den EditText konzentriert und beim Klicken auch keine Tastatur anzeigt, hat dies für mich funktioniert.

Hinzufügen von Attributen zum Hauptlayout

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

und dann das EditText-Feld

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

Hier ist ein Beispiel:

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

Zusätzlich zu @mahe madi können Sie dies auch versuchen

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

Diese Methode blendet den Cursor aus, verliert den Fokus und setzt vor allem die Textfarbe auf Schwarz, wie bei TextView.

Und um zu editText zurückzukehren, tun Sie dies einfach, um alle Eigenschaften von EditText zu erhalten.

editText.setEnabled(true);

Ich hoffe es hilft :)


3

Sie könnten verwenden, android:editable="false"aber ich würde Ihnen wirklich raten, es zu verwenden, setEnabled(false)da es dem Benutzer einen visuellen Hinweis gibt, dass das Steuerelement nicht bearbeitet werden kann. Der gleiche visuelle Hinweis wird von allen deaktivierten Widgets verwendet und die Konsistenz ist gut.


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

Das Attribut "longClickable" deaktiviert die Aktionen für langes Drücken, bei denen die Optionen "Einfügen" und "Alle auswählen" als QuickInfo angezeigt werden.


2

Ich habe folgendes versucht:

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

  }

});

Das Problem war jedoch, dass wenn der Bearbeitungstext der erste im Formular ist, er den Fokus erhält und der pickCode () - Code, der eine neue Aktivität startet, sofort aufgerufen wird. Also habe ich den Code wie folgt geändert und er scheint ziemlich gut zu funktionieren (außer ich kann den Fokus nicht auf die Textbearbeitung legen, muss es aber nicht):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

Freundliche Grüße,

Kommentare willkommen,

John Goche


1
Scheint gut zu funktionieren, aber ist es nicht einfacher, TextView zu verwenden, das wie EditText aussieht (mit: style = "@ android: style / Widget.EditText")?
Android-Entwickler

2

Ich benutze EditText.setFocusable(false)und setze wieder true, wenn ich bearbeiten möchte.



2

Auf diese Weise hat der Job für mich erledigt, ich kann auswählen und in die Zwischenablage kopieren, aber ich kann nicht ändern oder einfügen.

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android: editierbar ist veraltet, also benutze stattdessen 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" unterscheidet sich stark von android: editierbar, probieren Sie es selbst aus!
Denys Vitali

Wenn Sie Ihren EditText nicht bearbeitbar machen möchten, kann ich vorschlagen, das TextView-Widget anstelle des EditText zu verwenden, da die Verwendung eines EditText in diesem Fall irgendwie sinnlos erscheint.
M-Razavi

Ihr Vorschlag gilt nicht für einen EditText mit einem PopupWindow. Sehen Sie sich dieses Bild an, um das Problem besser zu verstehen. In diesem Beispiel möchte ich das Aussehen eines EditText, aber ich muss ihn "sperren", damit der Benutzer den Wert nur über das Popup-Fenster ändern kann. Überprüfen Sie dieses Problem , um mehr Motivation zu sehen. Es ist ein Problem, das es seit 2009 gibt.
Denys Vitali

1

Ich hatte das gleiche Problem, aber nach der Beobachtung stellte ich fest, dass dies android:editable="false"nur funktioniert, wenn inputtype ( android:inputType="ANY_VALUE") im Edittext nicht angegeben ist.

Entfernen Sie inputType aus EditText und verwenden Sie editable = false. Dies funktioniert einwandfrei.


0

Ich löse dies mit einem Dialog.

    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

Kurze Antwort: Ich habe verwendet android:focusable="false"und es hat funktioniert. Click Listening funktioniert jetzt auch.



-10

Versuchen Sie diesen Code. Es funktioniert in meinem Projekt, also wird es in Ihrem Projekt funktionieren.

android:editable="false"

2
Ich kann bestätigen, dass dies nicht funktioniert und die Verwendung einer abgeschriebenen Methode nicht empfohlen wird.
Adorjan Princz

1
android: editierbar ist eigentlich die beste Lösung, wenn das Feld anklickbar, aber nicht bearbeitbar sein soll, dh um nach dem Klicken ein Dialogfeld zu öffnen.
Yar

Nicht, weil es bei Ihrem Projekt funktioniert, sondern bei uns. Sehr schlechtes Denken.
Neon Warge
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.