2010-12-09 18 views
8

he implementado mi TabActivity con diferentes actividades infantiles:Android: GestureDetector que no trabaja (gestureDetector.onTouchEvent (evento) siempre es falsa) con pestañas (TabActivity, TabWidget)

intent = new Intent().setClass(this, MyChildTabActiviy.class); 
// Initialize a TabSpec for each tab and add it to the TabHost 
spec = getTabHost.newTabSpec("tag").setIndicator("indicator", getResources().getDrawable(R.drawable.icon)).setContent(intent); 
getTabHost.addTab(spec); 
... 

Hasta el momento no hay problemas, todo funciona perfectamente multa. Estoy cambiando programáticamente entre pestañas, reemplazando actividades dentro de pestañas con ActivityGroups, etc., tal como se muestra en muchos tutoriales.

Pero mi problema es que cuando quiero verificar un gesto arrojadizo, mi gestureDetector.onTouchEvent (evento) siempre devuelve falso, por lo tanto, no se registra ningún gesto.

Esta es mi implementación de gestureDetector:

public class MyChildTabActiviy extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... building views, controls, etc. 
     GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 
class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
    return false; 
    // left to right swipe and right to left swipe 
    if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    //... fling logic ... 
    return true; 
    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    //... fling logic ... 
    return true; 
    } 
    return false; 
    } 
} 

Lo que pasa es que este código (y también la detección de aventura) funciona perfectamente bien, cuando estoy empezando estas actividades (hay cuatro actividades básicas, que a veces cambio a otras actividades) fuera de una TabActivity, por ej. como una actividad de iniciador. Pero no puedo hacer que funcione dentro de una TabActivity. Ya traté de agregar el GestureDetector a TabActivity, pero no funciona. Traté de agregar el GestureDetector a vistas específicas como algunas vistas de diseño o botones, ViewFlippers, etc. pero simplemente no funciona. Cuando estoy depurando, puedo ver que el evento táctil se desencadena y se registra un movimiento, pero simplemente no se evalúa como una aventura o cualquier otro gesto.

Así que mi pregunta es, ¿hay alguna limitación con respecto al uso de GestureDetectors con pestañas en Android? Como dije, los gestos se registran perfectamente fuera de TabActivity.

Agradecería muchísimo la ayuda de alguien que conoce la respuesta. Si hay una limitación, ¿cómo podría alguien solucionar el problema?

Gracias de antemano por las respuestas.

+0

Posible duplicado de [Detección de gestos Fling en el diseño de cuadrícula] (http://stackoverflow.com/questions/937313/fling-gesture-detection-on-grid-layout) – BergQuester

Respuesta

19

Echa un vistazo a la respuesta mencionada here. Él prácticamente hizo lo mismo que tú, pero si miras el primer comentario sobre la respuesta mejor calificada, Cdsboy lo puso en práctica implementando OnDown y regresando como verdadero. No estoy seguro de por qué es necesario, pero funcionó para mí.

+1

¡Esto también me ha ayudado! Tenía un código onFling que funcionaba bien en 1.5 y 1.6, pero a partir de 2.1 dejó de funcionar ... al volverse verdadero en onDown() solucionó el problema. – Justin

+0

gracias ... funcionó muy bien ... necesitaba el método OnDown() también ... – ahsan

+0

@Object Cuando anulo el 'onDown()' no se ha llamado a mi 'onFling()'. – BBdev

7

Como complemento a la respuesta @Abhinav 's (que por cierto me ayudó también), me gustaría decir que es necesaria Creo anulando onDown() porque su implementación por defecto en SimpleOnGestureListener es volver false. Siendo ACTION_DOWN el primero en llegar al oyente, lo haría descartar el evento, sea lo que sea.

+0

ahh por eso. Gracias por tomarte el tiempo para explicarme. –

Cuestiones relacionadas