Comment mettre Google Maps V2 sur un fragment à l'aide de ViewPager

138

J'essaie de faire une mise en page des onglets de la même manière dans Play Store. J'ai pu afficher la mise en page de l' onglet en utilisant des fragments et un viewpager d'Androidhive. Cependant, je ne peux pas implémenter google maps v2 dessus. J'ai déjà cherché sur Internet pendant des heures, mais je ne trouve pas de tutoriel sur la façon de le faire. Quelqu'un peut-il me montrer comment?

Jeongbebs
la source
3
c'est drôle que je doive revenir à la question que j'ai posée il y a 3 ans pour me souvenir de la manière de la mettre en œuvre.
Jeongbebs
Il n'y a pas beaucoup de différence entre l'implémentation de ceci pour Activityet Fragmentune fois a getChildFragmentManager()été utilisé.
NecipAllef

Réponses:

320

En utilisant ce code, nous pouvons configurer MapView n'importe où, à l'intérieur de n'importe quel ViewPager, Fragment ou Activity.

Dans la dernière mise à jour de Google pour Maps, seul MapView est pris en charge pour les fragments. MapFragment & SupportMapFragment ne fonctionne pas. Je me trompe peut-être, mais c'est ce que j'ai vu après avoir essayé d'implémenter MapFragment & SupportMapFragment.

Configuration de la mise en page pour afficher la carte dans le fichier location_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

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

</RelativeLayout>

Maintenant, nous codons la classe Java pour afficher la carte dans le fichier MapViewFragment.java:

public class MapViewFragment extends Fragment {

    MapView mMapView;
    private GoogleMap googleMap;

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

        mMapView = (MapView) rootView.findViewById(R.id.mapView);
        mMapView.onCreate(savedInstanceState);

        mMapView.onResume(); // needed to get the map to display immediately

        try {
            MapsInitializer.initialize(getActivity().getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }

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

                // For showing a move to my location button
                googleMap.setMyLocationEnabled(true);

                // For dropping a marker at a point on the Map
                LatLng sydney = new LatLng(-34, 151);
                googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker Title").snippet("Marker Description"));

                // For zooming automatically to the location of the marker
                CameraPosition cameraPosition = new CameraPosition.Builder().target(sydney).zoom(12).build();
                googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
            }
        });

        return rootView;
    }

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

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

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

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

Enfin, vous devez obtenir la clé API de votre application en enregistrant votre application sur Google Cloud Console . Enregistrez votre application en tant qu'application Android native.

Arshu
la source
2
<uses-library android:name="com.google.android.maps" android:required="true" />est pour Maps V1, pas pour Maps V2. Il y aura à l'avenir des appareils qui ne disposeront pas de la com.google.android.mapsbibliothèque de micrologiciels mais qui seront parfaitement capables d'afficher des cartes Maps V2. Avoir cette ligne dans votre manifeste vous empêchera de fonctionner sur de tels appareils, et cette ligne n'est pas requise pour l'utilisation de Maps V2. Par exemple, les 17 projets sur github.com/commonsguy/cw-omnibus/tree/master/MapsV2 n'ont pas cet <uses-library>élément et fonctionnent correctement .
CommonsWare
7
J'obtiens une erreur en utilisant cette méthode. veuillez aider PID: 16260 java.lang.NullPointerException à com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) à com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72) le code est ici: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
Imran Ahmed
7
J'obtiens une erreur "NullPointerException" sur mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
aletede91
4
Le morceau de code d'exemple: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); plantera dans getMap () si findFragmentById () renvoie null.
Gunnar Forsgren - Mobimation
2
Ouais ça ne marche pas: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.bo.o()' on a null object reference
Peter Weyand
146

L'approche suivante fonctionne pour moi.

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

/**
 * A fragment that launches other parts of the demo application.
 */
public class MapFragment extends Fragment {

MapView mMapView;
private GoogleMap googleMap;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // inflat and return the layout
    View v = inflater.inflate(R.layout.fragment_location_info, container,
            false);
    mMapView = (MapView) v.findViewById(R.id.mapView);
    mMapView.onCreate(savedInstanceState);

    mMapView.onResume();// needed to get the map to display immediately

    try {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    googleMap = mMapView.getMap();
    // latitude and longitude
    double latitude = 17.385044;
    double longitude = 78.486671;

    // create marker
    MarkerOptions marker = new MarkerOptions().position(
            new LatLng(latitude, longitude)).title("Hello Maps");

    // Changing marker icon
    marker.icon(BitmapDescriptorFactory
            .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

    // adding marker
    googleMap.addMarker(marker);
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
    googleMap.animateCamera(CameraUpdateFactory
            .newCameraPosition(cameraPosition));

    // Perform any camera updates here
    return v;
}

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

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

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

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

fragment_location_info.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.gms.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Brandon Yang
la source
8
tu es un génie, tu m'as sauvé la vie. mMapView.onResume (); // nécessaire pour que la carte s'affiche immédiatement était la clé
Stephane
1
J'obtiens toujours la même erreur java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Je pensais que le try catch s'occuperait de cela. Est-ce que quelqu'un peut m'aider?
@BrandonYang c'est un homme génial .. J'ai pu résoudre le tiroir de navigation et la combinaison de cartes très simplement ... Cheers !!
Sreehari
@BrandonYang: Savez-vous pourquoi vous devez appeler manuellement tous les rappels de cycle de vie pour mMapView?
Christian Aichinger
6
getMap()est obsolète. Utilisez plutôt getMapAsync et onMapReadyCallback: stackoverflow.com/a/31371953/4549776
jmeinke
80

Vous pouvez utiliser cette ligne si vous souhaitez utiliser GoogleMapdans un fragment:

<fragment
            android:id="@+id/map"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment" />

GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();
Maddy
la source
4
Merci de votre réponse! toutes les autres réponses ne fonctionnent pas avec les dernières bibliothèques de support
Kamil Nekanowicz
1
L'appel d'un fragment à l'intérieur d'un fragment est-il une bonne pratique? comment cela affecte-t-il les performances de l'application et la bonne conception de logiciels?
AouledIssa
49

Dernières trucs avec getMapAsyncau lieu de celui obsolète.

1. vérifier le manifeste pour

<meta-data android:name="com.google.android.geo.API_KEY" android:value="xxxxxxxxxxxxxxxxxxxxxxxxx"/>

Vous pouvez obtenir la clé API de votre application en enregistrant votre application sur Google Cloud Console. Enregistrez votre application en tant qu'application Android native

2. dans votre mise en page de fragment .xml, ajoutez FrameLayout (pas fragment):

                  <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="250dp"
                android:layout_weight="2"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:id="@+id/mapwhere" />

ou quelle que soit la hauteur que vous voulez

3. Dans onCreateView dans votre fragment

    private SupportMapFragment mSupportMapFragment; 

    mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere);
    if (mSupportMapFragment == null) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        mSupportMapFragment = SupportMapFragment.newInstance();
        fragmentTransaction.replace(R.id.mapwhere, mSupportMapFragment).commit();
    }

    if (mSupportMapFragment != null)
    {
        mSupportMapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override public void onMapReady(GoogleMap googleMap) {
                if (googleMap != null) {

                    googleMap.getUiSettings().setAllGesturesEnabled(true);

                      -> marker_latlng // MAKE THIS WHATEVER YOU WANT

                        CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(15.0f).build();
                        CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                        googleMap.moveCamera(cameraUpdate);

                }

            }
        });
OWADVL
la source
3
Merci, gagnez beaucoup de temps, c'est la bonne réponse aujourd'hui avec les dernières mises à jour de la bibliothèque.
Sam
Pour moi, cela n'a pas fonctionné. J'ai passé tellement de temps à remarquer que, la mise en page devrait être <fragmentau lieu deFrameLayout
user3448282
OMI il y a une petite mais importante erreur dans le code. Il devrait y avoir FragmentManager fragmentManager = getChildFragmentManager (); au lieu de getFragmentManager lors de l'ajout de SupportMapFragment. Dans l'état actuel du code, le fragment de carte est toujours ajouté lorsque onCreateView est appelé (ce qui est incorrect, car il ne conserve pas l'état de la carte). De plus, j'appellerais getMapAsync uniquement dans la branche mSupportmapFragment == null pour effectuer les paramètres initiaux une seule fois!
user1299412
@ user1299412 man, vous pouvez éditer le message, et je vais simplement mettre à jour la réponse. :)
OWADVL
Lorsque j'ai changé le SupportMapFragmenten MapFragmentdans l'activité, changé le FrameLayouten fragmentdans le fichier de mise en page et et changé le com.google.android.gms.maps.SupportMapFragmenten com.google.android.gms.maps.MapFragmentcela fonctionne très bien pour moi. Avant ces changements, cela ne fonctionnait pas. Peut-être que cela aide les autres ....
CodeNinja
10

voici ce que j'ai fait en détail:

De là, vous pouvez obtenir la clé API google map

manière alternative et simple

connectez-vous d'abord à votre compte Google, visitez les bibliothèques Google et sélectionnez l'API Google Maps Android

dépendance trouvée dans l'activité de la carte par défaut du studio android:

compile 'com.google.android.gms:play-services:10.0.1'

mettez votre clé dans le fichier mainifest android sous l'application comme ci-dessous

dans AndroidMainifest.xml apportez ces modifications:

    // required permission
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


        // google map api key put under/inside <application></application>
        // android:value="YOUR API KEY"
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIzasdfasdf645asd4f847sad5f45asdf7845" />

Code de fragment:

public class MainBranchFragment extends Fragment implements OnMapReadyCallback{

private GoogleMap mMap;
    public MainBranchFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_main_branch, container, false);
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.main_branch_map);
        mapFragment.getMapAsync(this);
        return view;
    }




     @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            LatLng UCA = new LatLng(-34, 151);
            mMap.addMarker(new MarkerOptions().position(UCA).title("YOUR TITLE")).showInfoWindow();

            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(UCA,17));

        }
    }

dans votre fragment xml:

<fragment
                android:id="@+id/main_branch_map"
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context="com.googlemap.googlemap.MapsActivity" />
dharmx
la source
`gMapFragment.getMapAsync` a une référence non résolue sur getMapAsync. Cela ne marche pas.
Peter Weyand
êtes-vous en activité ou en fragment?
dharmx
cela marche! mais je ne sais pas si appeler un fragment à l'intérieur d'un fragment est une bonne pratique ou non! S'il vous plaît aviser
AouledIssa
5

Pour le problème d'obtenir un NullPointerExceptionlorsque nous changeons les onglets dans un, il FragmentTabHostvous suffit d'ajouter ce code à votre classe qui a l'extension TabHost. Je veux dire la classe où vous initialisez les onglets. Voici le code:

/**** Fix for error : Activity has been destroyed, when using Nested tabs 
 * We are actually detaching this tab fragment from the `ChildFragmentManager`
 * so that when this inner tab is viewed back then the fragment is attached again****/

import java.lang.reflect.Field;

@Override
public void onDetach() {
    super.onDetach();
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
Arshu
la source
que dois-je importer sur le type "Champ"? Il existe de nombreuses possibilités.
Jeongbebs
dois-je vous envoyer mon projet? et puis peut-être me dire quoi faire?
Jeongbebs
projet envoyé à votre email.
Jeongbebs
vous n'avez pas ajouté le google-play-service.jar à votre projet et vous devez également changer le project.properties de "target = android-18" à "target = Google Inc.: API Google: 18"
arshu
1
Ce bogue est suivi dans le suivi des problèmes Android Open Source: code.google.com/p/android/issues/detail?id=42601
Kristopher Johnson
4
public class DemoFragment extends Fragment {


MapView mapView;
GoogleMap map;
LatLng CENTER = null;

public LocationManager locationManager;

double longitudeDouble;
double latitudeDouble;

String snippet;
String title;
Location location;
String myAddress;

String LocationId;
String CityName;
String imageURL;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater
                .inflate(R.layout.fragment_layout, container, false);

    mapView = (MapView) view.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);

  setMapView();


 }

 private void setMapView() {
    try {
        MapsInitializer.initialize(getActivity());

        switch (GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getActivity())) {
        case ConnectionResult.SUCCESS:
            // Toast.makeText(getActivity(), "SUCCESS", Toast.LENGTH_SHORT)
            // .show();

            // Gets to GoogleMap from the MapView and does initialization
            // stuff
            if (mapView != null) {

                locationManager = ((LocationManager) getActivity()
                        .getSystemService(Context.LOCATION_SERVICE));

                Boolean localBoolean = Boolean.valueOf(locationManager
                        .isProviderEnabled("network"));

                if (localBoolean.booleanValue()) {

                    CENTER = new LatLng(latitude, longitude);

                } else {

                }
                map = mapView.getMap();
                if (map == null) {

                    Log.d("", "Map Fragment Not Found or no Map in it!!");

                }

                map.clear();
                try {
                    map.addMarker(new MarkerOptions().position(CENTER)
                            .title(CityName).snippet(""));
                } catch (Exception e) {
                    e.printStackTrace();
                }

                map.setIndoorEnabled(true);
                map.setMyLocationEnabled(true);
                map.moveCamera(CameraUpdateFactory.zoomTo(5));
                if (CENTER != null) {
                    map.animateCamera(
                            CameraUpdateFactory.newLatLng(CENTER), 1750,
                            null);
                }
                // add circle
                CircleOptions circle = new CircleOptions();
                circle.center(CENTER).fillColor(Color.BLUE).radius(10);
                map.addCircle(circle);
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

            }
            break;
        case ConnectionResult.SERVICE_MISSING:

            break;
        case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:

            break;
        default:

        }
    } catch (Exception e) {

    }

}

dans fragment_layout

<com.google.android.gms.maps.MapView
                android:id="@+id/mapView"
                android:layout_width="match_parent"
                android:layout_height="160dp"                    
                android:layout_marginRight="10dp" />
Vaishali Sutariya
la source
existe-t-il un moyen de déplacer le fragment de carte derrière un autre fragment, par exemple. fragment de menu? C'est en quelque sorte rafraîchissant et renvoyer mon fragment de menu au lieu de rester en arrière.
sitilge
Que voulez-vous faire réellement?
Vaishali Sutariya
3

Lorsque vous ajoutez votre carte, utilisez:

getChildFragmentManager().beginTransaction()
    .replace(R.id.menu_map_container, mapFragment, "f" + shabbatIndex).commit();

au lieu de .addet au lieu de getFragmentManager.

utilisateur1396018
la source
1

Je viens de créer MapActivity et de le gonfler pour le fragmenter. MapActivity.java:

package com.example.ahmedsamra.mansouratourguideapp;

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

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_categories);//layout for container
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new MapFragment())
                .commit();
        // 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);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng mansoura = new LatLng(31.037933, 31.381523);
        mMap.addMarker(new MarkerOptions().position(mansoura).title("Marker in mansoura"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(mansoura));
    }
}

activity_map.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.ahmedsamra.mansouratourguideapp.MapsActivity" />

MapFragment.java:-

package com.example.ahmedsamra.mansouratourguideapp;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * A simple {@link Fragment} subclass.
 */
public class MapFragment extends Fragment {


    public MapFragment() {
        // Required empty public constructor
    }


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

}
ahmed samra
la source
quoi? non quoi?
rexxar le
0

J'ai une solution de contournement pour NullPointerExceptionsupprimer le fragment DestoryView, il suffit de mettre votre code onStop()non onDestoryView. Ça fonctionne bien!

@Override
public void onStop() {
    super.onStop();
    if (mMap != null) {
        MainActivity.fragmentManager.beginTransaction()
                .remove(MainActivity.fragmentManager.findFragmentById(R.id.location_map)).commit();
        mMap = null;
    }
}
Ibrahim AbdelGawad
la source
0

Selon https://developer.android.com/about/versions/android-4.2.html#NestedFragments , vous pouvez utiliser des fragments imbriqués pour y parvenir en appelant getChildFragmentManager () si vous souhaitez toujours utiliser le fragment Google Maps au lieu du voir à l'intérieur de votre propre fragment:

SupportMapFragment mapFragment = new SupportMapFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.content, mapFragment).commit();

où "content" est la mise en page racine de votre fragment (de préférence un FrameLayout). L'avantage d'utiliser un fragment de carte est qu'alors le cycle de vie de la carte est géré automatiquement par le système.

Bien que la documentation dise "Vous ne pouvez pas gonfler une mise en page en un fragment lorsque cette mise en page comprend un <fragment>. Les fragments imbriqués ne sont pris en charge que lorsqu'ils sont ajoutés dynamiquement à un fragment.", J'ai réussi, d'une manière ou d'une autre, et cela a bien fonctionné. Voici mon code:
Dans la méthode onCreateView () du fragment:

View view = inflater.inflate(R.layout.layout_maps, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(...);

Dans la mise en page:

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

J'espère que ça aide!

Shreck Ye
la source
0

Ajout dynamique d'un fragment de carte pour afficher le téléavertisseur:

Si vous ciblez une application antérieure au niveau d'API 12, créez une instance de SupportedMapFragment et ajoutez-la à votre adaptateur de page d'affichage.

SupportMapFragment supportMapFragment=SupportMapFragment.newInstance();
        supportMapFragment.getMapAsync(this);

API de niveau 12 ou supérieur prend en charge les objets MapFragment

MapFragment mMapFragment=MapFragment.newInstance();
            mMapFragment.getMapAsync(this);
Adeeb Karim
la source
0

C'est la manière Kotlin:

En fragment_map.xmlvous devriez avoir:

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

Dans votre MapFragment.ktvous devriez avoir:

    private fun setupMap() {
        (childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?)!!.getMapAsync(this)
    }

Appel setupMap()à onCreateView.

Ssenyonjo
la source