Cómo deshabilitar copiar / pegar desde / hacia EditText

En mi aplicación, hay una pantalla de registro, donde no quiero que el usuario pueda copiar / pegar texto en el campo EditText . Configuré onLongClickListener en cada EditText para que el menú contextual que muestra copiar / pegar / mecanografiar y otras opciones no aparezca. Por lo tanto, el usuario no podrá copiar / pegar en los campos Editar.

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

Pero el problema surge si el usuario ha habilitado un teclado de un tercero que no sea el predeterminado de Android, que puede tener un botón para copiar / pegar o que puede mostrar el mismo menú contextual. Entonces, ¿cómo desactivo copiar / pegar en ese escenario?

Por favor, avíseme si hay otras formas de copiar / pegar también. (y posiblemente cómo desactivarlos)

Cualquier ayuda sería apreciada.

Si está utilizando el nivel API 11 o superior, entonces puede dejar de copiar, pegar, cortar y personalizar los menús contextuales.

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

Devolver falso desde onCreateActionMode (ActionMode, Menu) evitará que se inicie el modo de acción (Seleccionar todo, Cortar, Copiar y Pegar acciones).

El mejor método es usar:

 etUsername.setLongClickable(false); 

Puede hacer esto desactivando la pulsación larga de EditText

Para implementarlo, simplemente agregue la siguiente línea en el xml –

 android:longClickable="false" 

Puedo deshabilitar la funcionalidad de copiar y pegar con lo siguiente:

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

Espero que funcione para ti 😉

aquí está la mejor manera de deshabilitar copiar copia pegar de trabajo editText en todas las versiones

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

Además de setCustomSelectionActionModeCallback , y de las soluciones de clic largo desactivadas , es necesario evitar que los menús PEGAR / REEMPLAZAR aparezcan cuando se hace clic en el controlador de selección de texto, como se muestra en la siguiente imagen:

Manija de selección de texto con menú de pegar

La solución consiste en evitar que el menú PEGAR / REPRODUCIR aparezca en el método show() de la clase (no documentada) android.widget.Editor . Antes de que aparezca el menú, se realiza una comprobación de if (!canPaste && !canSuggest) return; . Los dos métodos que se utilizan como base para establecer estas variables están ambos en la clase EditText :

  • isSuggestionsEnabled() es público y, por lo tanto, puede ser anulado.
  • canPaste() no es, y por lo tanto debe ocultarse mediante la introducción de una función del mismo nombre en la clase derivada.

Una respuesta más completa está disponible aquí .

https://github.com/neopixl/PixlUI proporciona un EditText con un método

myEditText.disableCopyAndPaste() .

Y funciona en la antigua API

Solución de Kotlin:

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

Entonces simplemente puede llamar a este método en su TextView :

 override fun onCreate() { priceEditText.disableCopyPaste() } 

Si no desea deshabilitar el clic prolongado porque necesita realizar alguna funcionalidad con un clic prolongado, devolver la opción verdadero es una mejor opción para hacerlo.

El clic largo de edittext será así.

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

Según la documentación, la opción “Verdadero” indicará que se ha manejado un clic prolongado, por lo que no es necesario realizar operaciones predeterminadas.

Probé esto en los niveles de API 16, 22 y 25. Funcionó bien para mí. Espero que esto ayude

Aquí hay un truco para deshabilitar la ventana emergente “pegar”. Tienes que anular el método EditText :

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

Similar se puede hacer para las otras acciones.

Lea el Portapapeles, verifique en contra de la entrada y el tiempo que la entrada está “tipeada”. Si el Portapapeles tiene el mismo texto y es demasiado rápido, elimine la entrada pegada.

@Zain Ali, tu respuesta funciona en API 11. Solo quería sugerir una manera de hacerlo en API 10 también. Como tenía que mantener mi API de proyecto en esa versión, estaba jugando constantemente con las funciones disponibles en 2.3.3 y tuve la posibilidad de hacerlo. He compartido el fragmento a continuación. Probé el código y funcionó para mí. Hice este fragmento de urgencia. Siéntase libre de mejorar el código si hay algún cambio que pueda hacerse.

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

la solución es muy 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) { } }); } } 

——–> vista previa <---------

Intente seguir clase custome para copiar y pegar con Edittext en 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) { } } 

}

Similar a GnrlKnowledge, puede borrar el Portapapeles

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

Si lo desea, conserve el texto en el Portapapeles, y en onDestroy, puede configurarlo nuevamente.

Descubrí que cuando crea un filtro de entrada para evitar la entrada de caracteres no deseados, pegar dichos caracteres en el texto de edición no tiene ningún efecto. Entonces este tipo de problema también resuelve mi problema.

Puedes probar con android: focusableInTouchMode = “false”.

La solución que funcionó para mí fue crear Edittext personalizado y reemplazar el siguiente método:

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

}

Tratar de usar.

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

Utilizando otras soluciones, API 26 (Oreo) todavía mostraba el manejo del cursor con un solo toque sobre el texto ingresado, y luego se puede mostrar el menú. Solo la combinación de soluciones puede resolver mi problema.

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