Comment désactiver le copier / coller à partir de / vers EditText

dans ma demande, il y a un écran d'inscription, où je ne veux pas que l'utilisateur puisse copier/coller du texte dans le champ EditText . J'ai mis un onLongClickListener sur chaque EditText pour que le menu contextuel montrant copier/coller/inputmethod et d'autres options ne s'affichent pas. Ainsi, l'utilisateur ne pourra pas 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 L'Android par défaut, ce qui peut avoir un bouton pour copier/coller ou qui peut afficher le même menu contextuel. Alors, comment puis-je désactiver le copier/coller dans ce scénario ?

merci de me faire savoir s'il y a d'autres moyens de copier/coller aussi. (et peut-être comment les désactiver)

Toute aide serait appréciée.

94
demandé sur Reno 2011-06-08 11:05:12

20 réponses

si vous utilisez une API de niveau 11 ou plus,vous pouvez arrêter de copier,coller, couper et personnaliser les menus de contexte.

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

Renvoyant false à partir de onCreateActionMode(ActionMode, Menu) permettra d'éviter le mode d'action de démarrer(Tout Sélectionner, Couper, Copier et Coller des actions).

89
répondu Humble Coder 2015-06-01 20:02:57

la meilleure méthode est d'utiliser:

etUsername.setLongClickable(false);
97
répondu Vicky Kapadia 2012-12-11 13:15:47

vous pouvez le faire en désactivant la presse longue de L'EditText

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

android:longClickable="false"
30
répondu Ameya Pandilwar 2014-09-25 01:32:05

je peux désactiver la fonction 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);

Espérons que cela fonctionne pour vous ;-)

26
répondu Joseph Johnson 2012-11-11 18:21:07

voici la meilleure façon de désactiver le copier-coller de copie de travail 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;
            }
        });
    }
11
répondu Hardik 2014-03-31 08:09:37

en plus des solutions setCustomSelectionActionModeCallback , et désactivé long-click , il est nécessaire de empêcher la pâte / remplacer les menus d'apparaître lorsque le manche de sélection de texte est cliqué, comme dans l'image ci-dessous:

Text selection handle with paste menu

la solution consiste à empêcher le menu "coller/remplacer" d'apparaître dans le menu ." show() méthode de la classe (non documentée) android.widget.Editor . Avant que le menu n'apparaisse, une vérification est effectuée sur if (!canPaste && !canSuggest) return; . Les deux méthodes qui sont utilisées comme base pour définir ces variables sont à la fois dans la classe EditText :

une réponse plus complète est disponible ici .

8
répondu CJBS 2017-05-23 12:02:56

si vous ne voulez pas désactiver le clic long parce que vous devez effectuer certaines fonctionnalités sur le clic long que retourner true est une meilleure option pour le faire.

votre clic edittext long sera comme ceci.

edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});

selon documentation Retourner "True" indiquera que le long clic a été manipulé de sorte qu'il n'est pas nécessaire d'effectuer des opérations par défaut.

j'ai testé cela au niveau API 16, 22 et 25. Sa fonctionne très bien pour moi. Espérons que cela aidera.

4
répondu muak 2017-07-24 08:07:14

https://github.com/neopixl/PixlUI fournit un EditText avec une méthode

myEditText.disableCopyAndPaste() .

, Et il travaille sur l'ancienne API

3
répondu odemolliens 2013-11-14 16:51:32

Kotlin solution:

fun TextView.disableCopyPaste() {
    customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {}
    }
    isLongClickable = false
    setTextIsSelectable(false)
}

, Alors vous pouvez simplement appeler cette méthode sur votre TextView :

override fun onCreate() {
    priceEditText.disableCopyPaste()
}
3
répondu Alexandr 2017-07-20 17:51:04

voici un hack pour désactiver "paste" popup. Vous devez remplacer EditText méthode:

@Override
public int getSelectionStart() {
    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}

Similaire peut être fait pour les autres actions.

2
répondu Anton Tananaev 2017-01-19 22:11:50

lire le Presse-papiers, vérifier l'entrée et l'heure à laquelle l'entrée est"dactylographiée". Si le presse-papiers a le même texte et c'est trop rapide, supprimer l'collé d'entrée.

1
répondu kadir 2011-11-14 08:33:38

@Zain Ali, votre réponse fonctionne sur API 11. Je voulais juste Suggérer une façon de faire sur API 10 aussi bien. Depuis que j'ai dû maintenir mon API de projet sur cette version, je jouais constamment avec les fonctions disponibles en 2.3.3 et j'ai eu la possibilité de le faire. J'ai partager le fragment de code ci-dessous. J'ai testé le code et ça marchait pour moi. Je n'ai de cet extrait sur une urgence. N'hésitez pas à améliorer le code, si il y a des changements à faire..

// A custom TouchListener is being implemented which will clear out the focus 
// and gain the focus for the EditText, in few milliseconds so the selection 
// will be cleared and hence the copy paste option wil not pop up.
// the respective EditText should be set with this listener 
// tmpEditText.setOnTouchListener(new MyTouchListener(tmpEditText, tmpImm));

public class MyTouchListener implements View.OnTouchListener {

    long click = 0;
    EditText mEtView;
    InputMethodManager imm;

    public MyTouchListener(EditText etView, InputMethodManager im) {
        mEtView = etView;
        imm = im;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            long curr = System.currentTimeMillis();
            if (click !=0 && ( curr - click) < 30) {

                mEtView.setSelected(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.setSelected(true);
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);

            return true;
            }
            else {
                if (click == 0)
                    click = curr;
                else
                    click = 0;
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mEtView.requestFocusFromTouch();
                        mEtView.requestFocusFromTouch();
                        imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                    }
                },25);
            return true;
            }

        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            mEtView.setSelected(false);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mEtView.setSelected(true);
                    mEtView.requestFocusFromTouch();
                    mEtView.requestFocusFromTouch();
                    imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN);
                }
            },25);
            return true;
        }
        return false;
    }
1
répondu Aravind 2012-11-11 18:32:59

la solution est très simple

public class MainActivity extends AppCompatActivity {

EditText et_0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_0 = findViewById(R.id.et_0);

    et_0.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //to keep the text selection capability available ( selection cursor)
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            //to prevent the menu from appearing
            menu.clear();
            return false;
        }

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

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    });
   }
}

--------> aperçu <---------

1
répondu Muhammad Ali 2018-07-07 10:21:53

essayez de suivre la classe custome pour prévant copier et coller dans Edittext

public class SegoeUiEditText extends AppCompatEditText {
private final Context context;


@Override
public boolean isSuggestionsEnabled() {
    return false;
}
public SegoeUiEditText(Context context) {
    super(context);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    init();
}

public SegoeUiEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
    init();
}


private void setFonts(Context context) {
    this.setTypeface(Typeface.createFromAsset(context.getAssets(), "Fonts/Helvetica-Normal.ttf"));
}

private void init() {

        setTextIsSelectable(false);
        this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
        this.setLongClickable(false);

}
@Override
public int getSelectionStart() {

    for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
        if (element.getMethodName().equals("canPaste")) {
            return -1;
        }
    }
    return super.getSelectionStart();
}
/**
 * Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
 * by intercepting the callback that would cause it to be created, and returning false.
 */
private class ActionModeCallbackInterceptor implements ActionMode.Callback, android.view.ActionMode.Callback {
    private final String TAG = SegoeUiEditText.class.getSimpleName();

    public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; }
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; }
    public void onDestroyActionMode(ActionMode mode) {}

    @Override
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
        menu.clear();
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(android.view.ActionMode mode) {

    }
}

}

1
répondu Sagar Jethva 2018-08-10 19:53:24

en utilisant D'autres solutions, API 26 (Oreo) affichait encore le curseur par simple clic sur le texte entré, et le menu peut alors être affiché. Seule une combinaison de solutions peut résoudre mon problème.

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

    /**
    * This method sets TextView#Editor#mInsertionControllerEnabled field to false
    * to return false from the Editor#hasInsertionController() method to PREVENT showing
    * of the insertionController from EditText
    * The Editor#hasInsertionController() method is called in  Editor#onTouchUpEvent(MotionEvent event) method.
    */
    private void setInsertionDisabled() {
        try {
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editorObject = editorField.get(this);

            Class editorClass = Class.forName("android.widget.Editor");
            Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
            mInsertionControllerEnabledField.setAccessible(true);
            mInsertionControllerEnabledField.set(editorObject, false);
        }
        catch (Exception ignored) {
            // ignore exception here
        }
    }

    @Override
    public boolean isSuggestionsEnabled() {
        return false;
    }

    private class BlockedActionModeCallback implements ActionMode.Callback {
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

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

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

        public void onDestroyActionMode(ActionMode mode) {
        }
    }
}
1
répondu water 2018-08-27 11:22:22

similaire à GnrlKnowledge, vous pouvez effacer le bloc-notes

http://developer.android.com/reference/android/text/ClipboardManager.html

si vous voulez, conservez le texte dans le bloc-notes, et sur onDestroy, vous pouvez le remettre.

0
répondu Kevin D. 2011-11-23 02:16:03

j'ai constaté que lorsque vous créez un filtre d'entrée pour éviter l'entrée de caractères indésirables, collage de ces personnages dans l'édition de texte est sans effet. Donc, ce genre d'résout mon problème.

0
répondu rDroid 2011-11-23 03:54:11

vous pouvez essayer android:focableintouchmode="false".

0
répondu zgulser 2016-04-20 15:18:25

la Solution qui a fonctionné pour moi était de créer EditText personnalisé et outrepasser la méthode suivante:

public class MyEditText extends EditText {

private int mPreviousCursorPosition;

@Override
protected void onSelectionChanged(int selStart, int selEnd) {
    CharSequence text = getText();
    if (text != null) {
        if (selStart != selEnd) {
            setSelection(mPreviousCursorPosition, mPreviousCursorPosition);
            return;
        }
    }
    mPreviousCursorPosition = selStart;
    super.onSelectionChanged(selStart, selEnd);
}

}

0
répondu Palejandro 2017-01-13 13:50:48

Essayez d'utiliser.

myEditext.setCursorVisible(false);

       myEditext.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
répondu Thambidurai 2018-01-25 13:23:05