2010-07-23 22 views
5

Attualmente sto scrivendo un'app che mostra un MapView che mostra una mappa di google. ho usato il tutorial "ciao mappa" dal http://developer.android.com/resources/tutorials/views/hello-mapview.html e questo funziona fino ad ora: la mappa viene visualizzata, centrata e ingrandita correttamente, anche gli oggetti sovrapposti aggiunti sono visualizzati correttamente.GoogleMaps MapView si arresta su Tap in Android?

ma quando clicco su uno di quegli elementi di sovrapposizione ho aggiunto, l'applicazione va in crash con un'eccezione di puntatore nullo:

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) 

il mio codice è in gran parte copiato dal 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; 
     } 
    } 

Come devo risolvere questo?

risposta

4

mContext è null. Dal momento che l'overlay è una classe interna dell'attività, sostituire con act_map.this nella chiamata del costruttore AlertDialog.

+0

grazie! questo ha risolto il problema! – xenonite

+0

E se non fosse in una classe interiore? –

14

Ho anche avuto un problema con il tutorial di Android MapView. Quando ho fatto clic sull'icona, lo schermo si bloccava (sarebbe passato un mContext nullo):

La correzione di cui sopra non ha funzionato per me. Invece, ho cambiato la seguente riga di codice dalla classe MapActivity da:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

a questo:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

È inoltre necessario risolvere costruttore aggiungendo boundCenterBottom che manca:

public HelloItemizedOverlay(Drawable defaultMarker, Context context) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 

(Aveva screenshots belli ma non può postare perché sono nuovo: P)

La speranza che aiuta gli altri che hanno ancora un problema con il tutorial e corregge le loro app!

+0

Aveva lo stesso identico problema e questo l'ha risolto. Com'è che un errore così ovvio esiste nel loro tutorial? – wbarksdale

+0

+1 Yup questa era la mia soluzione. –

2

Utilizzare this invece, è un tutorial molto meglio di quello fornito da Google.

+1

Questo esempio è utile, ma utilizza il mapView.getZoomControls() deprecato. Questo può essere facilmente sostituito con mapView.setBuiltInZoomControls (true) del tutorial originale. – selwyn

2

chiama anche populate() in mapoverlay constructor

Problemi correlati