GoogleMap dentro de un fragmento en un ViewPager, guarda todos los eventos de toque en GoogleMap

Como dice el título, tengo un control de GoogleMap (API v2) dentro de un fragmento que es en sí mismo un elemento en un ViewPager. Cuando arrastre el mapa, si mi primer movimiento de arrastre está en el eje horizontal, ViewPager obtiene todos los eventos de arrastrar. Si hago mi primer movimiento de arrastre en el plano vertical, todos los arrastres siguientes son delegados al control de mapa. Me gustaría que GoogleMap capturara todos los eventos de arrastre. He añadido un poco de depuración y veo que cuando toco el control de mapa y cuando empiezo a arrastrar en el plano vertical, ningún evento onTouch incluso llegar a la ViewPager, por lo que parece que el GoogleMap tiene la primera oportunidad de manejar el evento o Pasarlo hacia abajo. No puedo encontrar ningún método u oyente en la clase GoogleMap para decirle que maneje todos los eventos de tocar / mover / arrastrar.

La solución fue crear un ViewPager personalizado con una anulación del método canScroll y usarlo en mi xml. El método canScroll se pasa un árbol de vistas secundarias recursivamente y luego decide si la Vista tiene permiso para manejar el desplazamiento horizontal o si debería ser capturado por el padre ViewPager

public class MyViewPager extends ViewPager { public MyViewPager (Context context) { super(context); } public MyViewPager (Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { // Not satisfied with this method of checking... // working on a more robust solution if(v.getClass().getName().equals("maps.jb")) { return true; } return super.canScroll(v, checkV, dx, x, y); } } 

Y en su diseño …

 <com.myproject.view.MyViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> 

Tuve el mismo problema y esta solución casi hizo el truco así que gracias por publicarlo.

La única diferencia que encontré fue que la clase view era maps.ib, así que usé esto en su lugar:

 @Override protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { if (v.getClass().getName().startsWith("maps.")) { return true; } return super.canScroll(v, checkV, dx, x, y); } 
  • Google oauth cómo utilizar el token de actualización
  • Privilegios elevados en la aplicación para Android
  • Fuga de memoria MediaControllerCompat
  • Ocultar aplicación de Android desde el Administrador de tareas
  • No se puede escribir en el campo de entrada después de cargar una página con InAppBrowser y la carga del hilador
  • ¿Cómo utilizo un proyecto Java que requiere un nivel de cumplimiento de 1.7 en una ruta de construcción de proyecto de Android?
  • Obtener progreso en onStopTrackingTouch no onProgressChanged en seekbar
  • Bloque sincronizado: son variables "dentro" de otras variables actualizadas
  • Anulación de variables de Fragmento on onDestroy ()
  • EditText crece a medida que el texto ingresa
  • ¿Es la mejor práctica para almacenar y usar un token OAuth2 en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.