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.
- Excepción de SDK de Google Drive
- InputStream no recibe EOF
- Transmisión de audio a través de socket TCP en Android
- ¿Cómo puedo encontrar todos los puntos de una ruta en Android?
- No se puede resolver "com.google.android.gms.gcm.GcmReceiver"?
- Digest autenticación en Android mediante HttpURLConnection
- Asynch hilo que detiene el hilo principal de interfaz de usuario
- Eliminar la sombra de android.widget.Toolbar
- Android ImageButton no muestra la imagen, aunque es visible en la vista previa de Designer
- Escribir datos ZipEntry a cadena
- Obtener un actor por nombre en libgdx
- ¿Cómo está comprobando Google SHA1 y el nombre del paquete en las llamadas de la API?
- Inflater y lazo no funciona como debería
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); }
- Cómo vincular a todas las aplicaciones de editor en Android Appstore de Amazon
- Lib no encontró error en tesseract