0

I'm having a lot of trouble adding a marker to the user selected spot. Here is my code

public class ShowMapActivity extends MapActivity {

public static Context context;
private MapController mapController;
MapView mapView;
private LocationManager locationManager;
private MyOverlays itemizedoverlay;

private int latitude;
private int longitude;

private int lat;
private int lng;

public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.map); // bind the layout to the activity

    // create a map view
    //RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.map);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    // Either satellite or 2d 
    mapView.setSatellite(true);
    mapController = mapView.getController();
    mapController.setZoom(14); // Zoon 1 is world view  
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
            0, new GeoUpdateHandler());

    Drawable drawable = this.getResources().getDrawable(R.drawable.point);
    itemizedoverlay = new MyOverlays(drawable);
    createMarker();

}



@Override
protected boolean isRouteDisplayed() {
    return false;
}



public class GeoUpdateHandler implements LocationListener {
//ignore this :)
    @Override
    public void onLocationChanged(Location location) {

        latitude = (int) (location.getLatitude() * 1E6);
        longitude = (int) (location.getLongitude() * 1E6);
        GeoPoint point = new GeoPoint(latitude, longitude);
        //createMarker();
        //Stop refreshing pointer
        //mapController.animateTo(point); // mapController.setCenter(point);

    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}

private void createMarker() {
    GeoPoint p = mapView.getMapCenter();        
    OverlayItem overlayitem = new OverlayItem(p, "", "");
    itemizedoverlay.addOverlay(overlayitem);
    mapView.getOverlays().add(itemizedoverlay);
    mapView.invalidate();

}

public void onBackPressed() {
  finish();
}   


}

MyOverlays.java

public class MyOverlays extends ItemizedOverlay<OverlayItem> {

private static int maxNum = 5;
private OverlayItem overlays[] = new OverlayItem[maxNum];
//private ArrayList<OverlayItem> overlays = new ArrayList<OverlayItem>();

private int index = 0;
private boolean full = false;
private MyOverlays itemizedoverlay;

private Context context;


public MyOverlays(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));

    context = Application.getAppContext();
}


        @Override
        public boolean onTouchEvent(MotionEvent event, MapView mapView) 
        {   
            //---when user lifts his finger---
            if (event.getAction() == 1) {                
                GeoPoint p = mapView.getProjection().fromPixels(
                    (int) event.getX(),
                    (int) event.getY());
                    Toast.makeText(context, 
                        p.getLatitudeE6() / 1E6 + "," + 
                        p.getLongitudeE6() /1E6 , 
                        Toast.LENGTH_SHORT).show();

                    int lat =  p.getLatitudeE6();
                    int lng =  p.getLongitudeE6();

                    int latTest = p.getLatitudeE6() / 1000000;
                    int lngTest = p.getLongitudeE6() / 1000000;

                    //Add marker for selected area
                    GeoPoint point2 = new GeoPoint(latTest, lngTest);
                    OverlayItem overlayitem2 = new OverlayItem(point2, "Test, konichiwa!", "Test");
                    itemizedoverlay.addOverlay(overlayitem2);
                    mapView.getOverlays().add(itemizedoverlay);

                    SharedPreferences longSettings = context.getSharedPreferences("LONGITUDE", 0);
                    SharedPreferences latSettings = context.getSharedPreferences("LATITUDE", 0);
                    Editor e = longSettings.edit();
                    Editor e2 = latSettings.edit();
                    e.putInt("LONGITUDE", lng);
                    e2.putInt("LATITUDE", lat);

                    e.commit();
                    e2.commit();


            }                        
            return false; 
        }        




@Override
protected OverlayItem createItem(int i) {
    return overlays[i];
}

@Override
public int size() {
    if (full) {
        return overlays.length;
    } else {
        return index;
    }

}

public void addOverlay(OverlayItem overlay) {
    if (index < maxNum) {
        overlays[index] = overlay;
    } else {
        index = 0;
        full = true;
        overlays[index] = overlay;
    }
    index++;
    populate();
}


}

createMarker() works fine in my ShowMapActivity but not when trying to do it manually within 'MyOverlays'. I wasn't sure if I was giving the location parameters correctly so I've tried both ways (see lat and latTest). That doesn't appear to the issue.

Stacktrace

03-14 04:24:54.596: E/AndroidRuntime(31512): FATAL EXCEPTION: main
03-14 04:24:54.596: E/AndroidRuntime(31512): java.lang.NullPointerException
03-14 04:24:54.596: E/AndroidRuntime(31512):    at     com.lol.MyOverlays.onTouchEvent(MyOverlays.java:60)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.google.android.maps.MapView.onTouchEvent(MapView.java:679)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.View.dispatchTouchEvent(View.java:3901)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1714)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1130)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1698)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1884)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.os.Looper.loop(Looper.java:130)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at android.app.ActivityThread.main(ActivityThread.java:3835)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at java.lang.reflect.Method.invokeNative(Native Method)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at java.lang.reflect.Method.invoke(Method.java:507)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-14 04:24:54.596: E/AndroidRuntime(31512):    at dalvik.system.NativeStart.main(Native Method)

Anyone have any guidance?

CitizenSmif
  • 103
  • 1
  • 3
  • 12

1 Answers1

0

Looks to me like itemizedoverlay is never initialized.

i.e., you declare it at the top with:

private MyOverlays itemizedoverlay;

then you try to dereference it while still null with:

itemizedoverlay.addOverlay(overlayitem2);
MikeV
  • 1,220
  • 2
  • 13
  • 17
  • Thanks Mike, looks like your right. How can I initialize this within the MyOverylays class as it is just a helper class? I've tried adding 'private Drawable defaultMarker' at the top to try and be able to access the defaultMarker passed to the 'MyOverlays' constructor. This didn't work. I'm not sure how I can call 'this.getResources().getDrawable(R.drawable.point);' in the MyOverlays class as I do in ShowMapActivity in order to call 'itemizedoverlay = new MyOverlays(drawable);'. Sorry, bit of a noob at coding. – CitizenSmif Mar 14 '12 at 18:10