GoogleMaps MapView se bloquea enTap en Android?
Actualmente estoy escribiendo una aplicación que muestra un MapView que muestra un mapa de google. He utilizado el tutorial "hello map view" desde http://developer.android.com/resources/tutorials/views/hello-mapview.html y esto funciona hasta ahora: el mapa se muestra, centrado y ampliado correctamente, incluso el OverlayItems Que he añadido se muestran correctamente.
Pero cuando hago clic en uno de esos elementos de superposición que he añadido, la aplicación se bloquea con una excepción de puntero nulo:
- Cómo dibujar el texto en el marcador predeterminado de google map v2
- Android toque en el mapa y obtenga coordenadas
- La ventana de información de Mapas v2 no se muestra cuando se toca el marcador, pero sí después de tocar la Ventana de información invisible
- Cómo mover el marcador a lo largo de la polilínea mediante google map
- ¿Cómo activar el evento onClick de un marcador en un Google Maps V2 para Android?
07-23 16:24:48.167: ERROR/AndroidRuntime(2530): java.lang.NullPointerException 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:753) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.app.AlertDialog$Builder.<init>(AlertDialog.java:273) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at net.xenonite.wifiloc.act_map$MapItemizedOverlay.onTap(act_map.java:182) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:453) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.google.android.maps.MapView$1.onSingleTapUp(MapView.java:347) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:533) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.google.android.maps.MapView.onTouchEvent(MapView.java:647) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.View.dispatchTouchEvent(View.java:3709) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.view.ViewRoot.handleMessage(ViewRoot.java:1708) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.os.Handler.dispatchMessage(Handler.java:99) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.os.Looper.loop(Looper.java:123) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at android.app.ActivityThread.main(ActivityThread.java:4595) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at java.lang.reflect.Method.invokeNative(Native Method) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at java.lang.reflect.Method.invoke(Method.java:521) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 07-23 16:24:48.167: ERROR/AndroidRuntime(2530): at dalvik.system.NativeStart.main(Native Method)
Mi código se copia en su mayor parte del tutorial:
public class act_map extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); intent = getIntent(); lat = intent.getDoubleExtra("lat", 0.0); lng = intent.getDoubleExtra("lng", 0.0); MapView = (MapView) findViewById(R.id.act_map_mapview); List<Overlay> mapOverlays = MapView.getOverlays(); Drawable positionMarker = getResources().getDrawable(R.drawable.act_map_androidmarker); MapItemizedOverlay itemizedOverlay = new MapItemizedOverlay(positionMarker); geoPoint = new GeoPoint((int) (lat * 1000000), (int) (lng * 1000000)); Pointer = new OverlayItem(geoPoint, "Thats me!", "wohooo"); itemizedOverlay.addOverlay(Pointer); mapOverlays.add(itemizedOverlay); MapView.setSatellite(false); MapController = MapView.getController(); MapController.setCenter(geoPoint); MapController.setZoom(18); MapView.setBuiltInZoomControls(true); MapView.displayZoomControls(true); } @Override protected boolean isRouteDisplayed() { return false; } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_I) { MapView.getController().setZoom(MapView.getZoomLevel() + 1); return true; } else if (keyCode == KeyEvent.KEYCODE_O) { MapView.getController().setZoom(MapView.getZoomLevel() - 1); return true; } else if (keyCode == KeyEvent.KEYCODE_S) { MapView.setSatellite(true); return true; } else if (keyCode == KeyEvent.KEYCODE_M) { MapView.setSatellite(false); return true; } return false; } public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); private Context mContext; public MapItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public MapItemizedOverlay(Drawable defaultMarker, Context context) { super(defaultMarker); mContext = context; } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { return mOverlays.get(i); } @Override public int size() { return mOverlays.size(); } @Override protected boolean onTap(int index) { OverlayItem item = mOverlays.get(index); AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); dialog.setTitle(item.getTitle()); dialog.setMessage(item.getSnippet()); dialog.show(); return true; } }
¿Cómo puedo solucionar esto?
- Cómo crear un marcador de mapa de bits personalizado con Android mapa API v2
- Cómo obtener coordenadas de pantalla de marcador en google maps v2 android
- Actualizar continuamente el marcador cuando cambia la ubicación en Android
- Cómo centrar el texto en android IconGenerator
- Google Maps de Google - marcador marcado abre una nueva actividad o una ventana más grande
- Cómo borrar todos los marcadores en v2 google map?
- Android Google Map addMarker () muy lento al agregar 400 marcadores
- Cómo mostrar el marcador de posición actual en el mapa en android?
mContext
es null
. Dado que su superposición es una clase interna de la actividad, reemplace mContext
con act_map.this
en su AlertDialog
constructor AlertDialog
.
También tuve un problema con el tutorial de Android MapView. Cuando hice clic en el icono, la pantalla se bloquearía (se pasaría un mContext nulo):
La solución anterior no funcionó para mí. En su lugar, cambié la siguiente línea de código de la clase MapActivity de:
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);
a esto:
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
También necesita arreglar constructor agregando boundCenterBottom
que falta:
public HelloItemizedOverlay(Drawable defaultMarker, Context context) { super(boundCenterBottom(defaultMarker)); mContext = context; }
(Tenía hermosas capturas de pantalla pero no puedo publicar porque soy nuevo: P)
Espero que ayude a otros que todavía están teniendo un problema con el tutorial y corrige sus aplicaciones!
Utilice esto en su lugar, es un tutorial mucho mejor que el proporcionado por google.
También llame a populate () en mapoverlay constructor
- ¿Cómo personalizar los servicios de Google Play para reducir el tamaño del frasco?
- ¿Cómo forzar la división de la pestaña de ActionBar y el título / Inicio / Menú?