web-dev-qa-db-fra.com

getMapAsync () dans Fragment

J'ai du mal à implémenter Google Map dans Fragment.

C'est ma partie de ma classe de fragments:

public class FragmentStoreFinderMap extends Fragment implements OnMapReadyCallback {

// Google Map
private GoogleMap googleMap;
private int i;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        googleMap = ((SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(
              R.id.map)).getMapAsync(this);

Je reçois une erreur dans getMapAsync (ceci). Je dis type incompatible.

ça dit:

requis: com.google.Android.gms.map.GoogleMap

trouvé: vide

BTW voici mon xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<fragment class="com.google.Android.gms.maps.SupportMapFragment"
    Android:id="@+id/map"
    Android:name="com.google.Android.gms.maps.SupportMapFragment"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

</LinearLayout>
14
RussVirtuoso

Dans votre mise en page XML, vous devriez faire comme ça

<FrameLayout 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">

<com.google.Android.gms.maps.MapView
    Android:id="@+id/map"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

</FrameLayout>

à l'intérieur de votre fragment mettre en œuvre cette

private MapView mapView;
private GoogleMap googleMap;

remplacer onCreateView s'il n'y a pas onCreateView tout comme le code ci-dessous

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.your_layout, container, false);
}

remplacer onViewCreated () à l'intérieur de cette onViewCreated () mettre ceci

mapView = (MapView) view.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);
mapView.onResume();
mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment

quand vous implémentez déjà OnMapReadyCallback dans votre fragment mettez ceci/code comme ceci

@Override
public void onMapReady(GoogleMap map) {
    googleMap = map;
}

j'espère que cela vous aide.

51
Lester L.

Après quelques surchauffes dans ma tête, grâce à ce post et https://stackoverflow.com/a/34732804/3925554 , je dirais qu'il existe actuellement deux façons d'ajouter un MapFragment à votre application :

<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android" 
class="com.google.Android.gms.maps.SupportMapFragment"
Android:id="@+id/map"
Android:name="com.google.Android.gms.maps.SupportMapFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>

De cette façon, vous devez utiliser un fragment standard et l'implémenter à l'intérieur. En fait, vous insérez un fragment dans un autre:

    @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
    supportMapFragment.getMapAsync(this);
}

L'autre façon serait d'utiliser le vrai SupportMapFragment et de l'implémenter de cette manière:

    @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    getMapAsync(this);
}

Et ils fonctionnent sans avoir à définir une mise en page dans onCreateView ni appeler mapView.onCreate(savedInstanceState); et mapView.onResume(); manuellement dans onViewCreated(), ce qui n'est pas recommandé de toute façon.

J'espère que ça aide!

1
marcRDZ
 SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
 FragmentTransaction fragmentTransaction =
 getChildFragmentManager().beginTransaction();
 fragmentTransaction.add(R.id.flMap, mMapFragment);
 fragmentTransaction.commit();
 mMapFragment.getMapAsync(this);
1
Tarun Umath

Votre code renvoie cette erreur car getMapAsync() ne renvoie rien. Si vous regardez la documentation de cette fonction:

public void getMapAsync (rappel OnMapReadyCallback)

Définit un objet de rappel qui sera déclenché lorsque l'instance de GoogleMap sera prête à être utilisée.

Notez que:

Cette méthode doit être appelée à partir du thread principal. Le rappel sera exécuté dans le thread principal. Dans le cas où les services Google Play ne sont pas installés sur l'appareil de l'utilisateur, le rappel ne sera pas déclenché tant que l'utilisateur ne l'a pas installé. Dans les rares cas où le GoogleMap est détruit immédiatement après sa création, le rappel n'est pas déclenché. L'objet GoogleMap fourni par le rappel n'est pas nul.

OnMapReadyCallback est une interface qui doit être implémentée et transmise via cette fonction. Rien n'est actuellement affecté à votre variable googleMap, vous devez plutôt définir sa valeur dans ce bloc de code qui implements OnMapReadyCallback

@Override
    public void onMapReady(GoogleMap googleMap) {
        this.googleMap = googleMap;


    }

Ce code devrait être quelque part dans votre fragment. Étant donné que votre fragment implémente déjà cette interface, vous la transmettez en tant que this.

0
Adam Forbis