studio programacion herramientas fundamentos con avanzado aplicaciones android-widget android-edittext android android-keypad

android widget - programacion - Cómo deshabilitar copiar/pegar desde/hacia EditText



manual de android en pdf (17)

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

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.


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:

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 public 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í .


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.


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.


El mejor método es usar:

etUsername.setLongClickable(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); }

}


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.


Puede hacer esto desactivando la pulsación larga de EditText

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

android:longClickable="false"


Puedes probar con android: focusableInTouchMode = "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 ;-)


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


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 documentation 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



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


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


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