androidgoogle-mapsandroid-maps-v2android-maps

Null object error in mMap.setOnMapClickListener(this);


package com.example.mukesh.airpollution;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;
import java.util.List;

import java.util.ArrayList;

public class MapsActivity extends FragmentActivity
        implements OnMapClickListener, OnMapReadyCallback {

    //final int RQS_GooglePlayServices = 1;
    private GoogleMap mMap;
    //private GoogleMap googleMap;


    boolean markerClicked;
    PolygonOptions polygonOptions;
    Polygon polygon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is      ready to be used.
        //  SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
        //        .findFragmentById(R.id.map);
        // mapFragment.getMapAsync(this);


        
        MapFragment mapFragment = (MapFragment)        getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync((OnMapReadyCallback) this);

        mMap.setOnMapClickListener(this);
      //  MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
       // mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        ArrayList<Polygon> polygonList = new ArrayList<>();
        Polygon polygon = mMap.addPolygon(new PolygonOptions()
                        .add(new LatLng(28.555335, 76.798553), new LatLng(28.830117, 76.935883), new LatLng(28.882919, 77.080078), new LatLng(28.868489, 77.220154), new LatLng(28.714438, 77.328644), new LatLng(28.519141, 77.3698434), (new LatLng(28.399615, 77.196808)), (new LatLng(28.555335, 76.798553)))
                        .strokeColor(Color.RED)

                //    .fillColor(Color.BLUE)
                //
        );



        // ArrayList<Polygon> polygonList = new ArrayList<>();
        Polygon p1 = mMap.addPolygon(new PolygonOptions()
                .add(new LatLng(28.882919, 77.080078), new LatLng(28.752972,  77.078705), new LatLng(28.714438, 77.328644), new LatLng(28.868489, 77.220154),new LatLng(28.882919, 77.080078))

                .strokeColor(Color.RED)

                .fillColor(Color.BLUE));

        // ArrayList<Polygon> polygonList = new ArrayList<>();
        Polygon p2 = mMap.addPolygon(new PolygonOptions()
                        .add(new LatLng(28.882919, 77.080078), new LatLng(28.752972, 77.078705), new LatLng(28.830117, 76.935883), new LatLng(28.882919, 77.080078))

                        .strokeColor(Color.RED)

                //.fillColor(Color.BLUE)
        );
        Polygon p3 = mMap.addPolygon(new PolygonOptions()
                        .add(new LatLng(28.555335, 76.798553), new LatLng(28.752972, 77.078705), new LatLng(28.830117, 76.935883), new LatLng(28.555335, 76.798553))

                        .strokeColor(Color.RED)

                // .fillColor(Color.BLUE)
        );
        final LatLng SYDNEY = new LatLng(28.6139,77.2090);
        final LatLng MOUNTAIN_VIEW = new LatLng(28.6387, 77.0941);

        final LatLngBounds.Builder bounds;
        final LatLng s=new LatLng(28.643353 ,77.446747);
        bounds = new LatLngBounds.Builder();
        bounds.include(new LatLng(28.643353, 77.446747));
        bounds.include(new LatLng(28.509488, 76.823273));



        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 10));


        mMap.animateCamera(CameraUpdateFactory.zoomIn());


        mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);


        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(MOUNTAIN_VIEW)      
                .zoom(10)                  
                .bearing(90)                
                .tilt(30)                  
                .build();                  
                                                                                           mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));







        mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {

                                           @Override
                                           public void onCameraChange(CameraPosition arg0) {
                                               // Move camera.
                                               // googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(),
                                               if (arg0.zoom >= 10) ;

                                               else if (arg0.zoom < 9) {
                                                   CameraPosition cameraPosition1 = new CameraPosition.Builder()
                                                           .target(MOUNTAIN_VIEW)      // Sets the center of the map to Mountain View
                                                           .zoom(12)                   // Sets the zoom
                                                           .bearing(90)                // Sets the orientation of the camera to east
                                                           .tilt(30)                   // Sets the tilt of the camera to 30 degrees
                                                           .build();                   // Creates a CameraPosition from the builder
                                                   mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition1));

                                               }
                                               // Remove listener to prevent position reset on camera move.
                                               //  googleMap.setOnCameraChangeListener(googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(),12)));


                                               //googleMap.(latlngbounds);
                                           }

                                       }

        );

    }



    @Override
    public void onMapClick(LatLng point) {
        Polygon polygon = mMap.addPolygon(new PolygonOptions()
                .add(new LatLng(0, 0), new LatLng(0, 5), new LatLng(3, 5), new LatLng(0, 0)));

        Polygon p1 = mMap.addPolygon(new PolygonOptions()
                .add(new LatLng(0, 0), new LatLng(0, 5), new LatLng(3, 5), new LatLng(0, 0)));

        Polygon p2 = mMap.addPolygon(new PolygonOptions()
                .add(new LatLng(0, 0), new LatLng(0, 5), new LatLng(3, 5), new LatLng(0, 0)));

        Polygon p3 = mMap.addPolygon(new PolygonOptions()
                .add(new LatLng(0, 0), new LatLng(0, 5), new LatLng(3, 5), new LatLng(0, 0)));


        //CHANGE POLYGON SPECIFICATIONS
        //ADD ALL POLYGONS


        List<LatLng> points = polygon.getPoints();
        List<LatLng> points1 = p1.getPoints();
        List<LatLng> points2 = p2.getPoints();
        List<LatLng> points3 = p3.getPoints();


        if (PolyUtil.containsLocation(point, points, false)) {
            //Do SOMETHING...
        } else if (PolyUtil.containsLocation(point, points1, false)) {
            //Do SOMETHING...
        }
        if (PolyUtil.containsLocation(point, points2, false)) {
            //Do SOMETHING...
        }
        if (PolyUtil.containsLocation(point, points3, false)) {
            //Do SOMETHING...
        }


    }

}

Getting error in this line
mMap.setOnMapClickListener(this);

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mukesh.airpollution/com.example.mukesh.airpollution.MapsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.setOnMapClickListener(com.google.android.gms.maps.GoogleMap$OnMapClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.setOnMapClickListener(com.google.android.gms.maps.GoogleMap$OnMapClickListener)' on a null object reference at com.example.mukesh.airpollution.MapsActivity.onCreate(MapsActivity.java:58) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access$800(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)


Solution

  • First of all move the setOnMapClickListener to onMapReady(), then ensure that the Map layer has the highest value among all layers, as otherwise the onClickListener of the topmost layer will be called. That should do it. Let me know if there is any further issue. :)