In meiner Anwendung gibt es einen Registrierungsbildschirm, in dem ich nicht möchte, dass der Benutzer Text in das EditText
Feld kopieren / einfügen kann . Ich habe onLongClickListener
jeweils ein festgelegt, EditText
damit das Kontextmenü mit den Methoden Kopieren / Einfügen / Eingabemethode und anderen Optionen nicht angezeigt wird. Der Benutzer kann also nicht in die Bearbeitungsfelder kopieren / einfügen.
OnLongClickListener mOnLongClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// prevent context menu from being popped up, so that user
// cannot copy/paste from/into any EditText fields.
return true;
}
};
Das Problem tritt jedoch auf, wenn der Benutzer eine andere Tastatur eines Drittanbieters als die Android-Standardeinstellung aktiviert hat, die möglicherweise über eine Schaltfläche zum Kopieren / Einfügen verfügt oder dasselbe Kontextmenü anzeigt. Wie deaktiviere ich das Kopieren / Einfügen in diesem Szenario?
Bitte lassen Sie mich wissen, ob es auch andere Möglichkeiten zum Kopieren / Einfügen gibt. (und möglicherweise, wie man sie deaktiviert)
Jede Hilfe wäre dankbar.
Antworten:
Wenn Sie API Level 11 oder höher verwenden, können Sie verhindern, dass Kopier-, Einfüge-, Ausschneide- und benutzerdefinierte Kontextmenüs angezeigt werden.
Wenn Sie im onCreateActionMode (ActionMode, Menü) false zurückgeben, wird der Aktionsmodus nicht gestartet (Alle auswählen, Ausschneiden, Kopieren und Einfügen).
quelle
Die beste Methode ist:
quelle
android:longClickable="false"
:)Sie können dies tun, indem Sie das lange Drücken des EditText deaktivieren
Um es zu implementieren, fügen Sie einfach die folgende Zeile in die XML ein -
quelle
Ich kann die Funktion zum Kopieren und Einfügen folgendermaßen deaktivieren:
Hoffe es funktioniert bei dir ;-)
quelle
Hier ist der beste Weg, um das Ausschneiden, Kopieren und Einfügen von editText in allen Versionen zu deaktivieren
quelle
Zusätzlich zu setCustomSelectionActionModeCallback und deaktivierten Long-Click- Lösungen muss verhindert werden , dass die PASTE / REPLACE-Menüs angezeigt werden , wenn auf das Textauswahl-Handle geklickt wird ( siehe Abbildung unten):
Die Lösung besteht darin, zu verhindern, dass das Menü PASTE / REPLACE in der
show()
Methode der (nicht dokumentierten)android.widget.Editor
Klasse angezeigt wird . Bevor das Menü angezeigt wird, wird eine Überprüfung durchgeführtif (!canPaste && !canSuggest) return;
. Die beiden Methoden, die als Grundlage für die Festlegung dieser Variablen verwendet werden, befinden sich beide in derEditText
Klasse:isSuggestionsEnabled()
ist öffentlich und kann daher überschrieben werden.canPaste()
ist nicht und muss daher durch Einfügen einer gleichnamigen Funktion in die abgeleitete Klasse ausgeblendet werden .Eine vollständigere Antwort finden Sie hier .
quelle
Kotlin-Lösung:
Dann können Sie diese Methode einfach auf Ihrem
TextView
:quelle
Type mismatch
Fehlermeldung mit dieser BeschreibungRequired:ActionMode.Callback! Found:
in diesem Teilobject: ActionMode.Callback
. Irgendeine Idee, warum es möglicherweise nicht funktioniert?Bei Verwendung anderer Lösungen zeigte API 26 (Oreo) immer noch den Cursorgriff durch einmaliges Tippen auf eingegebenen Text an, und dann kann das Menü angezeigt werden. Nur eine Kombination von Lösungen kann mein Problem lösen.
quelle
Wenn Sie Long Click nicht deaktivieren möchten, weil Sie beim Long Click einige Funktionen ausführen müssen, ist die Rückgabe von true eine bessere Option.
Ihr edittext langer Klick wird so sein.
Gemäß Dokumentation Rückgabe von "True" an, dass lange Klicks verarbeitet wurden, sodass keine Standardoperationen ausgeführt werden müssen.
Ich habe dies auf API-Level 16, 22 und 25 getestet. Es funktioniert gut für mich. Hoffe das wird helfen.
quelle
android:longClickable="false"
in XML einstellenhttps://github.com/neopixl/PixlUI bietet
EditText
eine MethodemyEditText.disableCopyAndPaste()
.Und es funktioniert mit der alten API
quelle
Hier ist ein Hack zum Deaktivieren des Popups "Einfügen". Sie müssen die
EditText
Methode überschreiben :Ähnliches kann für die anderen Aktionen durchgeführt werden.
quelle
Ich habe diese Lösung getestet und das funktioniert
quelle
Lesen Sie die Zwischenablage, vergleichen Sie sie mit der Eingabe und der Zeit, zu der die Eingabe "eingegeben" wurde. Wenn die Zwischenablage denselben Text enthält und zu schnell ist, löschen Sie die eingefügte Eingabe.
quelle
@Zain Ali, Ihre Antwort funktioniert mit API 11. Ich wollte nur einen Weg vorschlagen, wie Sie auch mit API 10 arbeiten können. Da ich meine Projekt-API auf dieser Version pflegen musste, spielte ich ständig mit den in 2.3.3 verfügbaren Funktionen und bekam die Möglichkeit, dies zu tun. Ich habe das Snippet unten geteilt. Ich habe den Code getestet und er hat bei mir funktioniert. Ich habe diesen Ausschnitt dringend gemacht. Fühlen Sie sich frei, den Code zu verbessern, wenn Änderungen vorgenommen werden können.
quelle
Die Lösung ist sehr einfach
--------> Vorschau <---------
quelle
Versuchen Sie, der vorherigen Klasse für das vorherige Kopieren und Einfügen zu folgen
Edittext
}}
quelle
Für Smartphones mit Zwischenablage ist dies möglich.
quelle
Ähnlich wie bei GnrlKnowledge können Sie die Zwischenablage löschen
http://developer.android.com/reference/android/text/ClipboardManager.html
Wenn Sie möchten, behalten Sie den Text in der Zwischenablage bei, und bei onDestroy können Sie ihn erneut festlegen.
quelle
Ich habe festgestellt, dass das Einfügen solcher Zeichen in den Bearbeitungstext keine Auswirkungen hat, wenn Sie einen Eingabefilter erstellen, um die Eingabe unerwünschter Zeichen zu vermeiden. Diese Art löst also auch mein Problem.
quelle
Sie können android versuchen: focusableInTouchMode = "false".
quelle
Die Lösung, die für mich funktioniert hat, bestand darin, einen benutzerdefinierten Edittext zu erstellen und die folgende Methode zu überschreiben:
}}
quelle
Versuchen zu benutzen.
quelle
Wer in Kotlin nach einer Lösung sucht, verwendet die folgende Klasse als benutzerdefiniertes Widget und verwendet sie in der XML.
Klasse SecureEditText: TextInputEditText {
}}
quelle
Ich habe die Erweiterungsfunktion in Kotlin- Sprache hinzugefügt :
Sie können es so verwenden:
auch unter Zeile in Ihrer XML hinzugefügt:
quelle