Im Layout können Sie die einstellen EditText
Widget über das nicht editierbar sein android:editable attribute
.
Wie kann ich das im Code machen? Ich muss die machen EditText
Widget je nach Bedingungen bearbeitbar sein.
Wütender Hacker
Im Layout können Sie die einstellen EditText
Widget über das nicht editierbar sein android:editable attribute
.
Wie kann ich das im Code machen? Ich muss die machen EditText
Widget je nach Bedingungen bearbeitbar sein.
Gerry
editText.setFocusable(false);
editText.setClickable(false);
Dies gewährleistet die EditText
Steuerelement kann nicht ausgewählt und fokussiert werden, also kann es nicht bearbeitet werden.
Es kann aber auch nicht ausgewählt und kopiert werden.
– James Moore
2. Juli 2011 um 0:54 Uhr
Ich habe es gerade selbst ausprobiert,
So deaktivieren Sie die Textbearbeitung:
.setFocusable(false);
dies setzt auch setFocusableInTouchMode auf false!
So aktivieren Sie die Textbearbeitung:
setFocusableInTouchMode(true);
dies setzt auch setFocusable auf true;
Der beste Weg, dies zu tun, ist mit dieser einzelnen Codezeile:
textView.setKeyListener(null);
Die Dokumentation sagt für diese Methode:
Legt den Schlüssellistener fest, der mit dieser TextView verwendet werden soll. Dies kann null sein, um Benutzereingaben zu verbieten.
Das mag funktionieren, aber was ist, wenn Sie aufgrund bestimmter Kriterien zwischen bearbeitbar und nicht bearbeitbar wechseln müssen? Sie müssten Ihren eigenen KeyListener erstellen, um ihn wieder bearbeitbar zu machen, was sich falsch anfühlt.
– John
15. Juni 2011 um 14:12 Uhr
Hat auch andere Nebeneffekte, wie das Töten der Auswahl für die Kopie.
– James Moore
2. Juli 2011 um 0:55 Uhr
Was Christopher vorgeschlagen hat, sollte funktionieren. Es erlaubt Ihnen, Text aus dem Feld auszuwählen und zu kopieren, genauso als ob Sie das Feld als nicht bearbeitbar aus der XML definiert hätten (ich weiß nicht, wovon James spricht, aber es funktioniert zumindest auf Android 2.2.). Wenn Sie sich den Quellcode ansehen, ist das so ziemlich das, was getan wird, wenn das aktivierte xml-Attribut für eine beliebige TextView auf false gesetzt ist. Gemäß der Dokumentation müssen Sie möglicherweise setFocusable(true) aufrufen, nachdem Sie setKeyListener(null) aufgerufen haben.
–Timo
10. Dezember 2011 um 23:14 Uhr
@John Du kannst anrufen getKeyListener()
zuerst und verstauen Sie es für später, können Sie nicht (wenn es zuvor festgelegt wurde)? Oder ordnen Sie den getInputType vielleicht manuell einem Schlüssel-Listener zu. Oder erzwingen Sie einfach einen bekannten guten Schlüsselzuhörer. ZB sollten Sie in der Lage sein, den Standard-TextKeyListener damit festzulegen (habe es nicht getestet): textView.setKeyListener(TextKeyListener.getInstance());
–Timo
10. Dezember 2011 um 23:20 Uhr
KeyListener-Dokumente: „Tastendrücke bei Soft-Input-Methoden sind nicht erforderlich, um die Methoden in diesem Listener auszulösen, und es wird sogar davon abgeraten, dies zu tun. und wird es nur für einige Tastendrücke an Anwendungen liefern, die auf Ice Cream Sandwich oder früher abzielen.
– Stefan
15. Februar 2013 um 17:52 Uhr
abhi
android:editable="false"
android:inputType="none"
in deinem xml bzw
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);
oder
EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
Dies funktioniert nicht wie erwartet. Wenn Sie in dieser Lösung auf einen automatisch korrigierten Wortvorschlag klicken, wird das ausgewählte Wort entfernt.
– Augiwan
22. September 2015 um 8:49 Uhr
kann es atm nicht überprüfen, aber es hört sich so an, als ob @dlazar dieses Problem bereits erkannt und eine Lösung vorgeschlagen hat – es wurde der Antwort hinzugefügt
– Josef Pfleger
23. September 2015 um 16:43 Uhr
Ist es möglich, das Gegenteil zu tun? (Machen Sie den editText BEARBEITBAR)
– Ali Bdeir
15. Juli 2016 um 20:33 Uhr
Wenn Sie einen Teil des Textes auswählen, können Sie ihn löschen, indem Sie ein beliebiges Zeichen eingeben.
– YUSMLE
4. Oktober 2020 um 14:19 Uhr
Babasaheb
Sie können dies versuchen:
mEditText.setFocusable(false);
mEditText.setClickable(false);
mEditText.setFocusableInTouchMode(false);
mEditText.setLongClickable(false);
mEditText.setInputType(InputType.TYPE_NULL);
Dadurch wird EditText vollständig deaktiviert. Deaktivieren Sie das lange Drücken, wenn Sie nicht möchten, dass der Benutzer die Optionen zum Bearbeiten von Text öffnet.
Wille
Ich sehe keine verwandte Methode für dieses Attribut in der EditText-Klasse. Es gibt jedoch andere ähnliche Dinge, die Sie verwenden könnten, z
android:focus/setFocusable(boolean)
oder erstellen Sie eine andere TextView, deren
android:editable="false"
und verwenden setVisiblilty()
um zwischen den bearbeitbaren und nicht bearbeitbaren Ansichten zu wechseln. Wenn du benutzt View.GONE
der Benutzer wird nie erfahren, dass es zwei EditTexts gibt.
Wenn Sie ehrgeizig sind, könnten Sie wahrscheinlich etwas mit den EditText’s anfangen onTextChanged
Zuhörer mögen es, wenn es mit a reagiert setText
.
dlazar
[Posting a new answer, since I can’t comment on Josef’s answer.]
Der Eingabefilter funktioniert gut, hat aber einen subtilen Fehler: Wenn Sie eine Auswahl überschreiben, wird der gesamte Text gelöscht.
Angenommen, Sie haben den Text "foo"
in dem EditText
. Wenn Sie alles auswählen (z. B. durch Doppelklick darauf) und eingeben 'a'
, der Text verschwindet. Dies liegt daran, dass die InputFilter
wird aufgerufen als:
filter("a", 0, 1, "foo", 0, 3);
Der vorgeschlagene Eingabefilter gibt in diesem Fall den leeren String zurück (weil src.length() < 1
ist false
), was den fehlenden Text erklärt.
Die Lösung ist einfach zurück dst.subSequence(dstart, dend)
in der Filterfunktion. Dies funktioniert auch bei Löschungen problemlos.