Mapas de Android NullPointerException ItemizedOverlay

Esto no se refiere a ninguna parte de mi código en absoluto. ¿Cómo hago para llegar al fondo de ella?

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) 

Aquí está el método de dibujo del 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(); } } 

¡Ahora imprimo hacia fuera el stacktrace y ninguna diferencia! Unesdoc.unesco.org

¿Alguien tiene alguna idea que podría ayudar a llegar al fondo de esto?

EDIT – Código más reciente 28/11 FULL CLASS

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

En realidad el problema no está en la implementación de su ItemizedOverlay, sino en la implementación de su MapActivity. Como se puede ver a partir de un seguimiento de pila similar aquí en la línea 42, el OverlayBundle está llamando al método draw () de una superposición. Esto señala una superposición nula que agregó a su mapView en algún lugar.

Algunos consejos útiles: Definitivamente debe pasar un dibujable a su super constructor (utilizado de hit-testing) por uncommenting la primera línea de código que ya tiene en allí:

  public SitesOverlay() { //super(null); super(boundCenter(defaultMarker)); //items = getMainOverlayArray(); //items = mOverlays; populate(); } 

Y potencialmente no llamar a super.draw () en su método 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 

Lo más probable es que tenga que hacer las dos cosas.

Editar: Vamos a pensar en que definitivamente debe pasar un dibujable a su super constructor, ya que se utiliza para las pruebas de éxito. Se modificó el texto anterior para reflejarlo.

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

¿El tempOver no es asignado?

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

Es tempOver.getTitle (), .getTypeTextOut (), o .getdestination () null?

  • Android Crear imagen "Ghost" (Touch-through)
  • Las imágenes transparentes de OpenGL tienen negro en ellas
  • Cómo crear un diseño de superposición en una vista de lista
  • Cómo agregar vista de superposición sobre otra vista en android?
  • Android - vistas de servicio
  • ListView superpone otro diseño al desplazarse
  • Android: ¿Cómo overlay-a-bitmap / draw-over un mapa de bits?
  • El desplazamiento y el zoom de MapView es lento después de agregar muchas superposiciones
  • Superponer un color sobre una vista
  • Clips de superposición de objetos de galería
  • Diferentes marcadores con nombre en Google Android Map
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.