2012-03-23 9 views
6

Tengo un ViewPager que usa GridViews para páginas. Me gustaría que ViewPager cambie de página cuando deslizo la pantalla.Detección correcta de un golpe en un GridView colocado dentro de un ViewPager en Android

El problema es que los golpes no se detectan cuando se realizan a través de GridView. Fuera de GridView, los golpes funcionan correctamente; parece que GridView está atrapando todos los eventos táctiles sin pasarlo primero a ViewPager.

Mientras que jugando con el código fuente, lo hice para una clase personalizada se extendía desde GridView:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return pager.onInterceptTouchEvent(event); 
} 

- donde pager se refiere a la clase ViewPager. Con esto, ViewPager detectará correctamente los deslizamientos y moverá las páginas en consecuencia, pero no permite que GridView acepte ningún evento, por lo que no puedo hacer clic en los elementos.

Lo que me gustaría hacer es detectar correctamente los golpes en ViewPager y los clics de elementos en GridView.

+0

¿Tienes alguna solución para esto? – Praneeth

Respuesta

1

Puede anular onInterceptTouchEvent para evenement despacho donde desea

2

Alix está en el camino correcto. Me las arreglé para llegar a esta solución de aspecto simple. No estoy del todo seguro de cómo funciona, pero lo hace! Y para referencia futura, también funciona para otros tipos de vistas (TableLayout, por ejemplo) y no solo para GridView.

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: { 
     downX = x; 
     downY = y; 
     return super.onInterceptTouchEvent(event); 
    } 
    case MotionEvent.ACTION_MOVE: { 
     deltaX = Math.abs(downX - x); 
     deltaY = Math.abs(downY - y); 
     return super.onTouchEvent(event); 
    } 
    case MotionEvent.ACTION_UP: { 
     if (deltaX > 4 && deltaY > 4) { 
      super.onTouchEvent(event); 
     } 
    } 
    } 
    return super.onInterceptTouchEvent(event); 
} 
+0

Eso es trabajo, perfecto, gracias. Por favor, marque la respuesta como resuelta. – olegflo

+0

¡para mí solo está subiendo! bajar no funciona – Praneeth

+0

Esto funciona bien para mí, pero no puedo hacer clic en los elementos de la grilla. ¿Cualquier sugerencia? – AndroGeek

6

tuve problemas con la implementación de colig, pero yo era capaz de conseguir que funcione como subclase ViewPager y reemplazando el método onInterceptTouchEvent(). Solo revisé si había deslizamientos en la dirección X para permitir el desplazamiento vertical si era necesario.

private static final int minSwipeDistance = 30; 
private float mTouchX; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    boolean response = super.onInterceptTouchEvent(event); 
    float x = event.getX(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: 
     mTouchX = x; 
     break; 
    case MotionEvent.ACTION_MOVE: 
     float dX = Math.abs(x - mTouchX); 
     if (dX > minSwipeDistance) 
      return true; 
     break; 
    } 
    return response; 
} 
Cuestiones relacionadas