代码之家  ›  专栏  ›  技术社区  ›  Lee Armstrong

Android映射NullPointerException ItemizedOverlay

  •  4
  • Lee Armstrong  · 技术社区  · 15 年前

    这根本不涉及我代码中的任何地方。我该怎样才能弄清真相?

    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)
    

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

    我现在把stacktrace打印出来,没什么区别!:-(

    有没有人有什么想法可以帮助我们弄清真相?

    编辑-最新代码28/11全班

        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();
            }
    
    
    
        }
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    实际上,问题不在ItemizedOverlay的实现中,而在MapActivity的实现中。从类似的堆栈跟踪中可以看到 here 在第42行,OverlayBundle正在调用Overlay的draw()方法。这将指向添加到地图视图中的空覆盖。

    一些有用的提示: 通过取消注释已经在其中的第一行代码,您肯定应该将drawable传递给您的超级构造函数(用于命中测试):

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

    并且可能不会在draw()方法中调用super.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
    

    很可能你必须两者都做。

    编辑: 想一想,你肯定应该把drawable传递给你的超级构造函数,因为它用于命中测试。修改了上述案文以反映这一点。

        2
  •  1
  •   Falmarri    15 年前
     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;
                }
    

    临时工没有被分配吗?

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

    tempOver.getTitle()、.getTypeTextOut()或.getdestination()是否为空?