web-dev-qa-db-fra.com

Impossible de résoudre la méthode getMap ()

J'essaie de faire fonctionner un fragment de carte dans mon application et je continue de recevoir une erreur lorsque j'essaie d'obtenir mon objet GoogleMap.

FragmentWithMap.Java

import Android.Manifest;
import Android.app.Activity;
import Android.content.pm.PackageManager;
import Android.net.Uri;
import Android.os.Bundle;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.app.Fragment;
import Android.util.Log;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;

import com.google.Android.gms.maps.CameraUpdate;
import com.google.Android.gms.maps.CameraUpdateFactory;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.SupportMapFragment;
import com.google.Android.gms.maps.model.BitmapDescriptorFactory;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.Marker;
import com.google.Android.gms.maps.model.MarkerOptions;



public class FragmentWithMap extends Android.support.v4.app.Fragment {
    private OnFragmentInteractionListener mListener;
    private static final double LAT = 32.084;
    private static final double LON = 34.8878;
    Place place;
    private GoogleMap mMap;
    private View view;
    private Marker marker;
    int userIcon = FragmentWithDetails.userIcon;

    public static FragmentWithMap newInstance(Place place) {
        Bundle args = new Bundle();
        if (place != null) {
            args.putInt("id", place.getId());
            args.putString("name", place.getName());
            args.putString("address", place.getAddress());
            args.putFloat("lat", place.getLat());
            args.putFloat("lng", place.getLng());
        }
        FragmentWithMap fragment = new FragmentWithMap();
        fragment.setArguments(args);
        return fragment;
    }

    public FragmentWithMap() {
        //empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null && getArguments().getString("name") != null) {
            place = new Place(getArguments().getInt("id"), getArguments().getString("name"),
                    getArguments().getString("address"), getArguments().getFloat("lat"),
                    getArguments().getFloat("lng"));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_fragment_with_map, container, false);
        }
        setUpMapIfNeeded();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Android.support.v4.app.Fragment f = getFragmentManager()
                .findFragmentById(R.id.fragmnet_container_map);
        if (f != null) {
            try {
                getFragmentManager().beginTransaction().remove(f).commit();
            } catch (IllegalStateException ise) {
                Log.d("FragmentWithMap", "Already closed");
            }
        }

        ViewGroup parentViewGroup = (ViewGroup) view.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeAllViews();
        }
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public void showPlace(Place place) {
        setPlace(place);
        setUpMap();
    }

    public void setPlace(Place place) {
        this.place = place;
    }


    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(Uri uri);
    }

    private void setUpMapIfNeeded() {
        // Do a null check
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.


            Fragment mmm = getChildFragmentManager().findFragmentById(R.id.fragment_map2);
            mMap = ((SupportMapFragment) mmm).getMap();

            // Check if we were successful
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    private void setUpMap() {
        double lat = LAT;
        double lng = LON;
        String name = "You are here";
        if (place != null) {
            lat = place.getLat();
            lng = place.getLng();
            name = place.getName();
        }
        if (marker != null) {
            marker.remove();
        }
        LatLng position = new LatLng(lat, lng);
        MarkerOptions markerOptions = new MarkerOptions().
                position(position).
                title(name).
                icon(BitmapDescriptorFactory.fromResource(userIcon)).
                snippet("Your last recorded location");

        marker = mMap.addMarker(markerOptions);
        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        mMap.setMyLocationEnabled(true);
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(position, 15);
        mMap.animateCamera(cameraUpdate);
    }

}

Et voici le XML

fragment_with_map.xml

<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/fragment_map2"
    tools:context="com.example.eldad.myplacesapp.FragmentWithMap"
    Android:name="com.google.Android.gms.maps.SupportMapFragment"
    />

J'ai copié le code d'une autre application, où la méthode getMap () est simplement obsolète, donc je doute que le problème soit dans le code lui-même. Je n'ai aucun problème avec sa dépréciation, et je préfère ne pas utiliser le getMapAsync () si je n'ai pas à le faire. Mais ici, pour une raison quelconque, je reçois l'erreur

"Impossible de résoudre la méthode 'getMap ()'"

. Je reçois également une erreur

"Erreur: l'exécution a échoué pour la tâche ': app: compileDebugJavaWithJavac'.

La compilation a échoué; voir la sortie d'erreur du compilateur pour plus de détails. "

Bien que je ne puisse pas être sûr s'il est lié à ce problème.

15
Solmanian

La méthode getMap() était auparavant obsolète et maintenant elle a été supprimée. Si vous regardez la documentation de SupportMapFragment , elle n'est pas là.

Vous pouvez également voir dans les notes de version :

La fonction getMap () précédemment obsolète n'est plus disponible dans le SDK des services Google Play. (Il est toujours disponible dans l'APK des services Google Play fourni aux appareils Android.) La fonction getMap () est déconseillée depuis décembre 2014. Voir le publication du billet de blog pour obtenir de l'aide sur la conversion de getMap () en getMapAsync ().

Et du blog:

En décembre 2014, nous avons déprécié getMap () au profit de getMapAsync (). À partir de cette version, vous devrez utiliser getMapAsync () pour compiler vos applications.

Donc, utilisez simplement getMapAsync (), c'est simple.

Demandez d'abord à votre fragment d'implémenter l'interface OnMapReadyCallback:

public class FragmentWithMap extends Android.support.v4.app.Fragment
          implements OnMapReadyCallback { 

Ensuite, modifiez votre code setUpMapIfNeeded () et ajoutez le rappel onMapReady ():

private void setUpMapIfNeeded() {
  if (mMap == null) {
    SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map2);
    mapFrag.getMapAsync(this);
  }
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    setUpMap();
}
28
Daniel Nugent

Utilisez ceci

compile 'com.google.Android.gms:play-services-location:8.4.0'


 map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
                R.id.map)).getMap();
1
Divyesh V.Murani