EditText: désactiver le menu contextuel Coller / Remplacer dans l'événement de clic du gestionnaire de sélection de texte
Mon but est d'avoir un EditText
qui n'a pas de caractéristiques de fantaisie, juste la Sélection de Texte, Gestionnaire de déplacer le curseur plus facilement -- donc, pas de menus de contexte ou des pop-ups.
J'ai désactivé l'apparence du texte en fonction d'édition actionbar (copier/Coller etc...) par la consommation de la ActionMode de Rappel de l'événement, comme par cette solution.
Le milieu de Milieu de Texte, Sélectionnez la Poignée (voir image ci-dessous) apparaît encore lorsque le texte existe dans le champ et cliquez sur se produit à l'intérieur du texte. Super! Je veux garder ce comportement. Ce que je NE veux PAS, c'est le "COLLER" du menu s'affiche lorsque le Texte Sélectionnez Gérer lui-même est cliqué.
J'ai aussi désactivé long-cliquez sur l'entrée pour le EditText par la mise en android:longClickable="false"
dans les styles XML. La désactivation du clic long prévient le "Coller/Remplacer" dans le menu apparaissant lorsque la souris est cliqué et lieu (c'est à dire long touch), cependant lorsque la souris est cliqué (single touch) dans le texte, la poignée de sélection s'affiche, et quand le texte poignée de sélection lui-même est cliqué, puis "coller" option de menu s'affiche (quand il y a du texte dans le presse-papiers). C'est ce que j'essaie d'éviter.
De ce que je peux voir à partir de la source, la ActionPopupWindow
est ce qui apparaît avec le COLLER/REMPLACER options. ActionPopupWindow est protégée variable (mActionPopupWindow), dans le privé, classe abstraite HandleView de l'etat dans la classe android.widget de.L'éditeur...
Court de désactiver le presse-papiers de service ou d'éditer le code Source Android, est-il une manière que je peux empêcher cela de montrer? J'ai essayé de définir un nouveau style pour android:textSelectHandleWindowStyle
et de définir android:visibility
à gone
mais il ne fonctionne pas (app a gelé pour un moment, alors qu'elle aurait autrement indiqué).
source d'informationauteur CJBS
Vous devez vous connecter pour publier un commentaire.
Solution: Remplacer
isSuggestionsEnabled
etcanPaste
dansEditText
.Pour la solution rapide, copie de la classe en dessous de cette classe remplace la
EditText
classe, et bloque tous les événements en conséquence.Pour les détails insignifiants, continuez à lire.
La solution réside dans la prévention de la COLLER/REMPLACER le menu qui s'affiche dans la
show()
méthode de la (non documenté)android.widget.Editor
classe. Avant que le menu s'affiche, une vérification est effectuée pourif (!canPaste && !canSuggest) return;
. Les deux méthodes sont utilisées comme base pour définir ces variables sont à la fois dans leEditText
classe:isSuggestionsEnabled()
est publicet peut donc être remplacée.canPaste()
n'est pas, et doit donc être caché par l'introduction d'une fonction du même nom dans la classe dérivée.L'incorporation de ces mises à jour dans une classe qui a aussi le setCustomSelectionActionModeCallbacket la désactivé long-cliquez surici, c'est la pleine classe pour éviter tous les outils d'édition (mais toujours afficher la la sélection de texte, gestionnaire de) pour contrôler le curseur:
J'ai testé cela dans Android v4.4.2 et v4.4.3.
ou tout simplement utiliser
OU en XML
Mise à jour
Fait que l'utilisateur veut désactiver le texte poignée de sélection lui-même
1. Créer une forme (handle.xml)
2. Dans votre EditText
Trouvé une autre solution quand le bleu (vue de l'insertion contrôleur) n'est pas apparu à tous. J'ai utilisé de la réflexion afin de fixer des objectifs de champ booléen de l'Éditeur de la classe. Regardez les android.widget de.L'éditeur et android.widget de.TextView pour plus de détails.
Ajouter le code suivant dans votre personnalisé EditText (avec tous les code précédent à ce sujet):
Aussi, peut-être vous pouvez trouver le meilleur endroit que onTouch() pour appeler la cible de la méthode.
Testé sur Android 5.1
Voici un hack pour désactiver l'option "coller" popup. Vous devez remplacer les
EditText
méthode:Cette solution fonctionne sur les versions plus récentes d'Android ainsi, à la différence de la accepté de répondre.
Je n'ai pas trouver un moyen de masquer le menu pop-up , Mais vous pouvez le désactiver à partir de collant si l'utilisateur appuyez sur le menu
Créer un personnalisé
EditText
et remplacer leonTextContextMenuItem
méthode et retourne la valeur false pourandroid.R.id.paste
etandroid.R.id.pasteAsPlainText
id de menu.Si vous avez besoin de retirer la PÂTE de la suggestion, effacer le presse-papiers avant le clic long.
Aucune des deux solutions n'a fonctionné pour moi. J'ai réussi à faire ma solution (explication après), aux personnes handicapées et de coller quoi que ce soit sur le EditText, tout en maintenant toutes les autres opérations valide.
Principalement, vous devez remplacer cette méthode sur votre mise en œuvre de EditText:
Afin de les étudier EditText code, après toutes les vérifications, coller (et tous les
ContextMenu
actions sur le EditText) arriver à une méthode appeléeonTextContextMenuItem
:Si vous remarquez, le collage ne se produire lorsque
id == ID_PASTE
donc, encore une fois, en regardant le EditText code:J'ai trouvé un moyen simple mais fiable. L'idée est de le consommer à l'écart de l'événement de touche, pour empêcher le contact de l'événement atteindre soulignant code par défaut.
Note, curseur clignotant est toujours à l'affiche à la fin du texte. Juste que la capture d'écran impossible à capturer.
De substituer une méthode:
Vous pouvez utiliser ce code:
Retour faux de
onCreateActionMode
va désactiver le couper,copier,coller options de l'API de niveau supérieur à 11.