2010-07-23 7 views
5

J'écris actuellement une application affichant un MapView montrant une carte google. J'ai utilisé le tutoriel "hello map view" de http://developer.android.com/resources/tutorials/views/hello-mapview.html et cela fonctionne jusqu'à maintenant: la carte est affichée, centrée et zoomée correctement, même les OverlayItems que j'ai ajoutés sont affichés correctement.GoogleMaps MapView se bloque surTap in Android?

Mais quand je clique sur un de ces éléments de recouvrement i ajoutée, l'application se bloque avec une exception de pointeur nul:

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) 

mon code est principalement copié à partir du tutoriel:

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; 
     } 
    } 

Comment est-ce que je répare ça?

Répondre

4

mContext est null. Puisque votre superposition est une classe interne de l'activité, remplacez mContext par act_map.this dans votre appel constructeur AlertDialog.

+0

thanx! Cela a résolu le problème! – xenonite

+0

Et qu'en est-il si ce n'est pas dans une classe interne? –

14

J'ai également eu un problème avec le tutoriel Android MapView. Lorsque je cliquais sur l'icône, l'écran se bloquait (un mContext nul était transmis):

La correction ci-dessus n'a pas fonctionné pour moi. Au lieu de cela, je l'ai changé la ligne de code suivante de la classe MapActivity de:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable); 

à ceci:

HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this); 

Vous devez également fixer le constructeur en ajoutant boundCenterBottom qui manque:

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

(A eu de belles captures d'écran, mais je ne peux pas poster parce que je suis nouveau: P)

Espérons que cela aidera les autres qui ont encore un problème avec le tutoriel et corrige leurs applications!

+0

Avait exactement le même problème et cela l'a réparé. Comment se fait-il qu'une telle erreur existe dans leur tutoriel? – wbarksdale

+0

+1 Yup c'était ma solution aussi bien. –

2

Utilisez plutôt this, c'est un tutoriel bien meilleur que celui fourni par google.

+1

Cet exemple est utile, mais utilise le fichier mapView.getZoomControls() obsolète. Cela peut facilement être remplacé par mapView.setBuiltInZoomControls (true) dans le didacticiel d'origine. – selwyn

2

appelle également populate() dans le constructeur mapoverlay

Questions connexes