Java – Mapbox does not work in fragments

Mapbox does not work in fragments… here is a solution to the problem.

Mapbox does not work in fragments

I’m trying to display the map box in fragment, but I get the following error:

java.lang.NullPointerException: Attempts to call the virtual method "void com.mapbox.mapboxsdk.maps.MapView.onResume()" on an empty object reference

This is the map fragment class:

public class Map extends android.support.v4.app.Fragment {
    private MapView mapView;

public Map() {
     Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.fragment_map, container, false);

MapView mapView = (MapView) layout.findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(MapboxMap mapboxMap) {

 Set map style
            mapboxMap.setStyleUrl(Style.MAPBOX_STREETS);

 Set the camera's starting position
            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(41.885, -87.679)) // set the camera's center position
                    .zoom(12)  // set the camera's zoom level
                    .tilt(20)  // set the camera's tilt
                    .build();

 Move the camera to that position
            mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

}

});
    return layout;
}

@Override
public void onResume() {
    super.onResume();
    mapView.onResume();
}

@Override
public void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}
}

Am I missing something? I’m following this link: https://www.mapbox.com/help/first-steps-android-sdk/

Solution

You have two map View instances. One is a local variable inside the oncreate method, and the other is a global variable.

And the global variable is not initialized, so change this line

MapView mapView = (MapView) layout.findViewById(R.id.mapview);

Enter this

mapView = (MapView) layout.findViewById(R.id.mapview);

I think you understand the question.

Related Problems and Solutions