Search code examples
androidgoogle-mapsgoogle-maps-api-2

Replace getMap with getMapAsync with custom support fragment


trying to update my google dependencies from 9.0.0 to 15.0.0. But I have to update

getMap();

with

getMapAsync();

Because getMap(); is deprecated in newest versions of google libraries.

The issue is I am using custom fragment to load the view. I am doing it this way because I have 3 different map types that can be loaded into the map view based on user selection. But it's not letting me do getMapAsync without error.

Here is my code:

private void setUpMapIfNeeded() {
    if (mMapFragment == null) {
        mMapFragment = new CustomSupportMapFragment(); 

        mMapFragment.setOnMapCreatedListener(new CustomSupportMapFragment.MapViewCreatedListener() {

            @Override
            public void onMapCreated() {
                boolean needUpdate = mMap == null;
                mMap = mMapFragment.getMapAsync();

                if (mMap != null)
                    setUpMap(needUpdate);
            }
        });

    }

    FragmentTransaction ft = getChildFragmentManager().beginTransaction();
    ft.replace(R.id.map, mMapFragment);
    ft.commit();
}

But I am getting error:

getMapAsync (OnMapReadyCallback) in SupportMapFragment cannot be applied to ()

So I tried adding this, getContext() in like this:

getMapAsync(this);

getMapAsync(getContext));

but both come back with errors about it cannot be applied.

Any ideas? Sorry for my understanding of java is new and I am learning. I tried searching StackOverflow and google already for this issue but can only find resolutions when using regular supportmapfragment and not custom supportmapfragment.

Here is my setUpMap method if it helps for you to understand:

private void setUpMap(boolean needUpdate) {
    boolean location_permission_granted = (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    if (!location_permission_granted) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200);
    } else {
        mMap.setMyLocationEnabled(true);
    }

    mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {

            if (LOAD_PARTICULAR_MAP == 1) {
                if (cameraPosition.zoom > AppConstants.MAX_ZOOM) {
                    CameraUpdate upd = CameraUpdateFactory.newLatLngZoom(cameraPosition.target, AppConstants.MAX_ZOOM);
                    mMap.moveCamera(upd);
                }


                float maxZoom = 4f;
                if (cameraPosition.zoom > maxZoom) {
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
                    return;
                }
                float minZoom = 0f;
                if (cameraPosition.zoom < minZoom) {
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(minZoom));
                    return;
                }
            }
        }
    });
    mMap.setOnMapLongClickListener(this);
    mMap.setOnMyLocationButtonClickListener(this);
    mMap.setOnMapClickListener(this);
    mMap.setOnMarkerDragListener(this);
    mMap.setOnMarkerClickListener(this);
//        mBtnMapType.setVisibility(View.VISIBLE);

    mMap.getUiSettings().setScrollGesturesEnabled(true);

    //mBtnLegend.setVisibility(View.VISIBLE);
    //updateLegendButton();
    updateMapType(mSettings.getMapType(GoogleMap.MAP_TYPE_TERRAIN));
    /*mTileProvider = new TranslucentUrlTileProvider(AppConstants.SERVER_URL, AppConstants.SERVER_URL_FREE);
//        mTileProvider.setPro(!mIsPro.showPurchaseDialog());
    //mTileProvider.setOpacity(mOpacity);
    mTileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mTileProvider));*/
    if (needUpdate)
        if (LOAD_PARTICULAR_MAP != 4) {
            gotoMyLocation();
        }
//        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()       {
//            @Override
//            public boolean onMarkerClick(Marker marker) {
//                if (marker != null) {
//                    openGoogleMap(marker);
//                    return true;
//                }
//                return false;
//            }
//        });

    switch (LOAD_PARTICULAR_MAP) {

        case 1:

            auroraOverMap();
            mMap.animateCamera(CameraUpdateFactory.zoomTo(0f));

            break;

        case 2:

            lightPollutionMap();

            break;

        case 3:

            loadCloudMap();

            break;

        case 4:

            highestValueView();
//                mMap.animateCamera( CameraUpdateFactory.zoomTo( 12f )    );

            break;
    }
}

Solution

  • You can't get GoogleMap object by calling

    mMap = mMapFragment.getMapAsync();
    

    you should use code like that:

    mMapFragment.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
        }
    });
    

    where mMap is global variable:

    public class MainActivity extends AppCompatActivity {
    
        private GoogleMap mMap;
        ...
    

    and after you got mMap you can use it for setup your map:

    mMapFragment.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            if (mMap != null)
                    setUpMap(needUpdate);
        }
    });
    

    Also, take a look at Official Tutorial.