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.
Fran Fitzpatrick
quelle
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());
Kristiono Setyadi
quelle
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.

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

Mahendran
quelle
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"
vida
quelle
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);
kouretinho
quelle
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.

Timuçin
quelle
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>
Massimo Fazzolari
quelle
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);
Adorjan Princz
quelle
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"
Kai Wang
quelle
8

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

Shahid Sarwar
quelle
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);
Askimp
quelle
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);
user3185897
quelle
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.

sarkisch
quelle
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>
Woppi
quelle
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 :)

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

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

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

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

nobjta_9x_tq
quelle
2

Versuche dies :

android:inputType="none"
Rutvik
quelle
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"
Löwe
quelle
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" />
M-Razavi
quelle
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.

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

            }
        });
João Scheleder Neto
quelle
0

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

Anbuselvan Rocky
quelle
-1

Versuchen

.setInputType(InputType.TYPE_NULL);
benmakp benmakn
quelle
-10

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

android:editable="false"
user2309848
quelle
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