151 votes

Comment désactiver le copier/coller depuis/vers l'EditText ?

Dans mon application, il y a un écran d'enregistrement, dans lequel je ne veux pas que l'utilisateur puisse copier/coller du texte dans l'écran d'enregistrement. EditText champ. J'ai défini un onLongClickListener sur chaque EditText de sorte que le menu contextuel affichant copier/coller/méthode de saisie et d'autres options ne s'affiche pas. Ainsi, l'utilisateur ne sera pas en mesure de copier/coller dans les champs d'édition.

 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;
        }
    };

Mais le problème se pose si l'utilisateur a activé un clavier tiers autre que celui par défaut d'Android, qui peut avoir un bouton pour copier/coller ou qui peut afficher le même menu contextuel. Comment désactiver le copier/coller dans ce cas ?

Veuillez me faire savoir s'il existe d'autres moyens de copier/coller. (et éventuellement comment les désactiver)

Toute aide serait appréciée.

0 votes

Si l'opération "coller" provient d'une IME, vous n'avez aucun moyen standard de la distinguer des frappes normales. Une idée à essayer est de mesurer le temps entre l'arrivée de chaque caractère et si le temps est trop court, alors les caractères proviennent d'une opération de "collage".

0 votes

Cela semble être une sale solution ! Cela vaut la peine de regarder.

1 votes

Utiliser Android:longClickable="false"

144voto

Vicky Kapadia Points 1829

La meilleure méthode est d'utiliser :

etUsername.setLongClickable(false);

67 votes

Ou, juste en xml android:longClickable="false" :)

22 votes

Le bouton Coller apparaîtra si vous appuyez sur l'indicateur de curseur bleu.

20 votes

Cela empêchera certainement la vue d'être longuement cliquable, mais les commandes d'édition peuvent également être demandées en double-cliquant sur le texte, ce qui signifie que cette solution n'est pas complète. Gardez cela à l'esprit pour vos besoins.

121voto

Zain Ali Points 3813

Si vous utilisez le niveau 11 de l'API ou un niveau supérieur, vous pouvez empêcher l'apparition des menus contextuels copier, coller, couper et personnalisés.

edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {                  
            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });

Le renvoi de false à partir de onCreateActionMode(ActionMode, Menu) empêchera le mode d'action d'être lancé (actions Select All, Cut, Copy et Paste).

1 votes

Qu'en est-il du niveau d'api inférieur à 13 ?

1 votes

Je ne comprends ni l'un ni l'autre des commentaires, cet exemple fonctionne avec api11+, avant api11 il n'y avait pas de copier-coller IIRC.

37 votes

Le bouton "Coller" apparaît lorsque l'on tape sur l'indicateur de curseur bleu.

56voto

Ameya Pandilwar Points 21

Vous pouvez le faire en désactivant l'appui long de l'EditText

Pour l'implémenter, il suffit d'ajouter la ligne suivante dans le fichier xml -

android:longClickable="false"

8 votes

Le problème est que l'utilisateur de mon application a un clavier tiers qui possède un bouton copier-coller.

6 votes

Un autre problème est que vous pouvez sélectionner le texte par un double tap et il affiche à nouveau le copier/coller.

41voto

Joseph Johnson Points 2093

Je suis en mesure de désactiver la fonctionnalité de copier-coller avec ce qui suit :

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
        return false;
    }

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);

J'espère que cela fonctionnera pour vous ;-)

0 votes

C'est exactement la même solution que j'ai trouvée en me basant sur les autres réponses ci-dessus. Elle devrait être marquée comme la solution correcte car elle gère les cas limites que les autres ne gèrent pas.

3 votes

Cette option bloque la copie mais vous pouvez toujours coller en cliquant sur le curseur.

12voto

Hardik Points 3026

Voici la meilleure façon de désactiver le copier-coller de la fonction editText dans toutes les versions.

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }

0 votes

Cela a fonctionné pour moi, j'ai juste dû ajouter @TargetApi(Build.VERSION_CODES.HONEYCOMB)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X