2010-11-15 7 views
4

Cela ne se réfère à aucun endroit dans mon code du tout. Comment puis-je aller au fond des choses?Android Maps NullPointerException ItemizedOverlay

java.lang.NullPointerException 
at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42) 
at com.google.android.maps.MapView.onDraw(MapView.java:494) 
at android.view.View.draw(View.java:6739) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
at android.view.View.draw(View.java:6742) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
at android.view.View.draw(View.java:6742) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872) 
at android.view.ViewRoot.draw(ViewRoot.java:1422) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1167) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1744) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:144) 
at android.app.ActivityThread.main(ActivityThread.java:4937) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

Voici la méthode de tirage de la ItemizedOverlay

public void draw(Canvas canvas, MapView mapView, boolean shadow) { 

      try { 
      super.draw(canvas, mapView, false); 

      if (getMainOverlayArray().size() != 0){ 

      pfOverlayItem tempOver = null; 
      for (int i = 0; i < getMainOverlayArray().size(); i++) { 

       tempOver = getMainOverlayArray().get(i); 

      boolean isMatch = false; 

      if (tempOver.getTitle().equals(selectedName)) 
      { 
       isMatch = true; 
      } 

      if (isMatch){ 

      Projection projection = mapView.getProjection(); 
      Point point = new Point(); 
      projection.toPixels(tempOver.getPoint(), point); 

      Paint background = new Paint(); 
      background.setColor(Color.WHITE); 
      background.setAlpha(150); 
      RectF rect = new RectF(); 
      rect.set(point.x - 55, point.y +15, 
        point.x + 100, point.y + 65); 
      canvas.drawRoundRect(rect, 5, 5, background); 


      Paint text = new Paint(); 
      text.setAntiAlias(true); 
      text.setColor(Color.BLUE); 
      text.setTextSize(14); 
      text.setTypeface(Typeface.MONOSPACE); 

      canvas.drawText(tempOver.getTitle() , point.x -50 , point.y + 30, text); 
      canvas.drawText(tempOver.getTypeTextOut(), point.x -50 , point.y + 45, text); 
      canvas.drawText(tempOver.getdestination(), point.x -50 , point.y + 60, text); 
      } 
      } 
      } 
      }catch (Exception e){ 
       Log.e("Error", "Problem drawing view", e); 
       e.printStackTrace(); 
      } 
     } 

imprimer maintenant le stacktrace et aucune différence! :-(

Est-ce que quelqu'un a des idées qui pourraient aider à aller au fond de cette

EDIT - dernier code 28/11 CLASSE COMPLET

private class SitesOverlay extends ItemizedOverlay<pfOverlayItem> { 
     private List<pfOverlayItem> items = new ArrayList<pfOverlayItem>(); 

     private PopupPanel panel=new PopupPanel(R.layout.popup); 
     private MapLocation selectedMapLocation; 
     private static final int CIRCLERADIUS = 2; 
     private ArrayList<pfOverlayItem> mOverlays = new ArrayList<pfOverlayItem>(); 



     public SitesOverlay() { 

      super(null); 
      //super(boundCenter(defaultMarker)); 
      //items = getMainOverlayArray(); 
      //items = mOverlays; 
      populate(); 

     } 



public void finishedLoading(){ 

    populate(); 

} 

     @Override 
     protected pfOverlayItem createItem(int i) { 
      // Log.i("CREATE","MARKER"); 
      return (items.get(i)); 

     } 

     public void addItem(OverlayItem overlay) { 
      overlay.setMarker(boundCenter(overlay.getMarker(0))); 
      items.add((pfOverlayItem) overlay); 
      //populate(); 
     } 

     public void clearItems(){ 
      runOnUiThread(new Runnable() { 
       public void run() { 
        items.clear(); 
        myMapView.invalidate(); 
       } 
      }); 


     } 

     public void clear() { 
      mOverlays.clear(); 
      myMapView.removeAllViews(); 
      //numItems = 0; 
      // Workaround for another bug with this class: 
      // http://groups.google.com/group/android-developers/browse_thread/thread/38b11314e34714c3 
      setLastFocusedIndex(-1); 
      populate(); 
     } 

     @Override 
     public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
      super.draw(canvas, mapView, false); 

      try { 


      if (getMainOverlayArray().size() != 0){ 

      pfOverlayItem tempOver = null; 
      for (int i = 0; i < getMainOverlayArray().size(); i++) { 

       tempOver = getMainOverlayArray().get(i); 

      boolean isMatch = false; 

      //Log.i("Selected Name",selectedName); 

      if (tempOver.getTitle().equals(selectedName)) 
      { 
       isMatch = true; 
      } 

      if (isMatch){ 

      Projection projection = mapView.getProjection(); 
      Point point = new Point(); 
      projection.toPixels(tempOver.getPoint(), point); 

      Paint background = new Paint(); 
      background.setColor(Color.WHITE); 
      background.setAlpha(150); 
      RectF rect = new RectF(); 
      rect.set(point.x - 50, point.y +15, 
        point.x + 90, point.y + 50); 
      canvas.drawRoundRect(rect, 5, 5, background); 


      Paint text = new Paint(); 
      text.setAntiAlias(true); 
      text.setColor(Color.BLUE); 
      text.setTextSize(14); 
      text.setTypeface(Typeface.MONOSPACE); 

      //canvas.drawRoundRect(rect, 2, 2, background); 
      canvas.drawText(tempOver.getTitle() + " " + tempOver.getcallsign(), point.x -50 , point.y + 30, text); 
      canvas.drawText(tempOver.getdestination() + " " + tempOver.getdraft(), point.x -50 , point.y + 45, text); 
      } 
      } 
      } 
      }catch (Exception e){ 
       Log.e("Error", "Problem drawing view", e); 
       e.printStackTrace(); 

      } 
     } 

     @Override 
     protected boolean onTap(int i) { 

      pfOverlayItem item = getItem(i); 

      if (selectedName.equals(item.getTitle())){ 

       //Toast.makeText(PlaneFinderMain.this, "SECOND MOFO PRESS", 3000).show(); 
       try{  
       Intent myIntent = new Intent(PlaneFinderMain.this, DetailActivity.class); 
       myIntent.putExtra("int", i); 
       myIntent.putExtra("string", selectedName); 
       PlaneFinderMain.this.startActivity(myIntent); 
       }catch (Exception e){ 
        Log.e("Error", "Cannot launch", e); 
       } 
      } 

      currentadshex = item.getmmsi(); 
      new GetRouteTask(item.getmmsi()).execute(); 

      selectedItem = i; 
      selectedName = item.getTitle(); 
      selectedPlanePoint = item.getPoint(); 

      GeoPoint geo=item.getPoint(); 
      Point pt=myMapView.getProjection().toPixels(geo, null); 

      View view=panel.getView(); 

      ((TextView)view.findViewById(R.id.reg)).setText(item.getTitle()); 
      ((TextView)view.findViewById(R.id.flightno)).setText(item.getcallsign()); 
      ((TextView)view.findViewById(R.id.route)).setText(item.getdestination()); 
      ((TextView)view.findViewById(R.id.height)).setText(item.getdraft()); 

      return (true); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) { 

      if (event.getAction() == MotionEvent.ACTION_DOWN){ 

       if (selectedPlanePoint != null){ 
        Projection projection = mapView.getProjection(); 
        Point point = new Point(); 
        projection.toPixels(selectedPlanePoint, point); 

        Point pointHit = new Point(); 
        pointHit.x=(int)event.getX(); 
        pointHit.y=(int)event.getY(); 

        if ((point.x - pointHit.x) >-100 && (point.x - pointHit.x) <70 && (point.y - pointHit.y) < -25 && (point.y - pointHit.y) > -95){ 

          try{  
           Intent myIntent = new Intent(PlaneFinderMain.this, DetailActivity.class); 

            myIntent.putExtra("int", selectedItem); 
            myIntent.putExtra("string", selectedName); 
            PlaneFinderMain.this.startActivity(myIntent); 

           }catch (Exception e){ 
            Log.e("Error", "Cannot launch", e); 
           } 

        }else{ 

        } 


       } 


      } 



      return false; 


     } 



     @Override 
     public int size() { 
      return (items.size()); 
     } 

     public void addOverlay(OverlayItem o){ 
      setLastFocusedIndex(-1); 
      populate(); 
     } 



    } 
+3

On dirait que vous passez null à un paramètre API, en particulier une superposition nulle quelque part dans une mapview probablement. Comment on est supposés savoir? – Falmarri

+0

regardez votre appel à OverlayBundle.draw() - c'est le meilleur que nous serons en mesure de faire (un stacktrace plus détaillé aidera) – KevinDTimm

+0

Pas un stacktrace plus détaillé aidera mais du code pour trouver ce qui est nul et pourquoi. –

Répondre

5

En fait, le problème ne réside pas dans l'implémentation de votre ItemizedOverlay, mais dans l'implémentation de votre MapActivity. Comme vous pouvez le voir à partir d'une trace de pile similaire here à la ligne 42, OverlayBundle appelle la méthode draw() d'une superposition. Cela pointe vers une superposition nulle que vous avez ajoutée à votre mapView quelque part.

Quelques conseils utiles: vous devriez certainement passer un drawable à votre constructeur super (utilisé des essais à succès) par décommentant la première ligne de code que vous avez déjà là:

 public SitesOverlay() { 

     //super(null); 
     super(boundCenter(defaultMarker)); 
     //items = getMainOverlayArray(); 
     //items = mOverlays; 
     populate(); 

    } 

et potentiellement pas appeler super.draw() dans votre méthode draw().

@Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     // why do you do this if you paint it yourself later on. 
     super.draw(canvas, mapView, false 

Très probablement, vous devrez réellement faire les deux.

Editer: Pensez-y, vous devriez certainement passer un dessinable à votre super constructeur car il est utilisé pour les tests d'impact. Modifié le texte ci-dessus pour refléter cela.

+0

J'ai essayé de passer 'null' pour le marqueur par défaut dans une application de test; cela donne une erreur différente. J'ai également essayé de retourner une superposition nulle; encore une fois, erreur différente. J'étais incapable de produire sa trace de pile. Mais encore, de bons conseils. En outre, il ne dessine pas les superpositions lui-même; il dessine simplement des étiquettes de texte à côté de chaque superposition. Cependant, il ne devrait pas passer 'false' dans' super.draw'. Lee, si vous ne voulez pas d'ombres sur vos marqueurs, vous ne devriez PAS appeler super quand 'shadow == false'. –

+0

Merci les gars, je pense que c'est très utile et je vais le mettre en œuvre mais seul le temps le dira! –

1
pfOverlayItem tempOver = null; 
      for (int i = 0; i < getMainOverlayArray().size(); i++) { 

       tempOver = getMainOverlayArray().get(i); 
boolean isMatch = false; 

      if (tempOver.getTitle().equals(selectedName)) 
      { 
       isMatch = true; 
      } 

Est-tempOver pas être affecté

canvas.drawText(tempOver.getTitle() , point.x -50 , point.y + 30, text); 
      canvas.drawText(tempOver.getTypeTextOut(), point.x -50 , point.y + 45, text); 
      canvas.drawText(tempOver.getdestination(), point.x -50 , point.y + 60, text); 

est tempOver.getTitle(), .getTypeTex tOut() ou .getdestination() null?

+0

Sûrement l'essai attraperait cela si? –

+0

Hmm. C'est le problème là. Vous masquer les problèmes en faisant un essai/à l'exception de tout. Ne fais pas ça. Gardez vos champs d'essai aussi petits que possible. Vous n'imprimez même pas un stacktrace dans votre except. – Falmarri

+0

Je déconnecte l'erreur. Si je me déconnecte du e.printStackTrace(); cela me donnera-t-il l'information dont j'ai besoin sur la console de Google pour aider à dépister cela? –

Questions connexes