programacion - manual de android en pdf
¿Por qué no funciona esta simulación MotionEvent? (2)
El OnTouchListener
se llama dentro de la Vista desde dispatchTouchEvent
que a su vez ha sido llamado desde ViewGroup
o TouchDelegate
. Si llama al oyente desde su punto de vista, simplemente hace lo que tenga allí y luego regresa. No delega mágicamente el evento táctil en ningún lado.
En su lugar, llame a dispatchTouchEvent()
en su vista para obtener el resultado correcto.
Para probar la unidad de su comportamiento de la aplicación en la selección de texto, etc. Consulte http://developer.android.com/resources/tutorials/testing/activity_test.html
En una de las vistas de una aplicación de ejercicios, intento realizar la selección de texto mediante programación.
Puedo ingresar (mediante programación) al "modo de selección de texto", que está visualmente indicado por CursorControllers (controladores AKA) en la esquina superior izquierda de la vista.
Si arrastro manualmente el CursorController derecho, luego lo hago clic de nuevo (en el emulador), funciona como se esperaba (perfectamente), mostrando un breve mensaje: "Texto copiado en el portapapeles".
Pero cuando trato de arrastrar programáticamente ese CursorController correcto, no pasa nada.
La forma en que trato de hacer esto es simulando un MotionEvent. En la vista, llamo:
event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);
MainActivity.onTouch(this, event);
En MainActivity I, por supuesto, implemento OnTouchListener:
@Override
public boolean onTouch(View v, MotionEvent event) { // called BEFORE button''s onTouchEvent()
Log.v("MainActivity::onTouch()", describeEvent(v, event));
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
return false;
}
Si entiendo correctamente, simplemente devolviendo ''falso'' desde onTouch, Android sigue buscando otro objeto UI para consumir el objeto MotionEvent, llegando finalmente a mi punto de vista .
¿Por qué no sucede esto?
Debo extrañar algo muy fundamental ...
Por falta de una solución de trabajo, solo puedo concluir que lo que he estado tratando de lograr no es posible en Android, por razones de seguridad. Se puede encontrar una explicación en el siguiente enlace: ¿Cómo enviar un evento MotionEvent sintetizado a través del sistema?