studio - Intercepción de Android pegar / copiar / cortar en editText
textwatcher multiple edittext (2)
Hay una forma mucho más simple, aunque no es 100% confiable.
Agrega TextChangedListener a tu caja de edición:
EditText et = (EditText) mView.findViewById(R.id.yourEditText);
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (count > 2) toast("text was pasted");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
}
});
Si el texto cambia para más de 2 caracteres, puede asumir que fue pegado (algunos emoticonos toman dos caracteres).
Por supuesto, no detectará el pegado cuando el usuario pegue 1 o dos caracteres, y notificará falsamente el pegado si el cambio en el texto fue activado por algo más.
Pero para la mayoría de los propósitos, hace el trabajo.
¿Cómo puedo interceptar este tipo de eventos?
Necesito agregar algo de lógica cuando el usuario intenta pegar texto en mi EditText
. Sé que puedo usar TextWatcher
pero este punto de entrada no es bueno para mí porque solo necesito interceptar en caso de pegar y no cada vez que el usuario presiona mi EditText
.
Parece que no hay mucho que puedas hacer usando la API: evento de pegado de android
TextView
en la fuente de Android de TextView
( EditText
es un TextView
con alguna configuración diferente) y descubrí que el menú que se usa para ofrecer las opciones de cortar / copiar / pegar es solo un ContextMenu
modificado ( source ).
En cuanto a un menú contextual normal, la Vista debe crear el menú ( source ) y luego manejar la interacción en un método de devolución de llamada ( source ).
Debido a que el método de manejo es public
, simplemente podemos conectarlo extendiendo EditText
y sobrescribiendo el método para reaccionar en las diferentes acciones. Aquí hay un ejemplo de implementación:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.EditText;
import android.widget.Toast;
/**
* An EditText, which notifies when something was cut/copied/pasted inside it.
* @author Lukas Knuth
* @version 1.0
*/
public class MonitoringEditText extends EditText {
private final Context context;
/*
Just the constructors to create a new EditText...
*/
public MonitoringEditText(Context context) {
super(context);
this.context = context;
}
public MonitoringEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public MonitoringEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
/**
* <p>This is where the "magic" happens.</p>
* <p>The menu used to cut/copy/paste is a normal ContextMenu, which allows us to
* overwrite the consuming method and react on the different events.</p>
* @see <a href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/widget/TextView.java#TextView.onTextContextMenuItem%28int%29">Original Implementation</a>
*/
@Override
public boolean onTextContextMenuItem(int id) {
// Do your thing:
boolean consumed = super.onTextContextMenuItem(id);
// React:
switch (id){
case android.R.id.cut:
onTextCut();
break;
case android.R.id.paste:
onTextPaste();
break;
case android.R.id.copy:
onTextCopy();
}
return consumed;
}
/**
* Text was cut from this EditText.
*/
public void onTextCut(){
Toast.makeText(context, "Cut!", Toast.LENGTH_SHORT).show();
}
/**
* Text was copied from this EditText.
*/
public void onTextCopy(){
Toast.makeText(context, "Copy!", Toast.LENGTH_SHORT).show();
}
/**
* Text was pasted into the EditText.
*/
public void onTextPaste(){
Toast.makeText(context, "Paste!", Toast.LENGTH_SHORT).show();
}
}
Ahora, cuando el usuario utiliza cortar / copiar / pegar, se muestra un Toast
(por supuesto, también puede hacer otras cosas).
Lo bueno es que esto funciona hasta Android 1.5 y no es necesario volver a crear el menú contextual (como se sugiere en la pregunta vinculada anterior), lo que mantendrá el aspecto constante de la plataforma (por ejemplo, con HTC Sense ).