144 votes

Comment mettre Google Maps V2 sur un fragment en utilisant ViewPager

Je suis en train d'essayer de faire une mise en page en onglets comme sur le Play Store. J'ai réussi à afficher la mise en page en onglets en utilisant des fragments et viewpager du site androidhive. Cependant, je n'arrive pas à implémenter google maps v2 dessus. J'ai déjà passé des heures à chercher sur internet, mais je ne trouve pas de tutoriel sur comment le faire. Est-ce que quelqu'un pourrait s'il vous plaît me montrer comment faire?

349voto

Arshu Points 2160

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

Dans la dernière mise à jour de Google pour Maps, seule MapView est prise en charge pour les fragments. MapFragment & SupportMapFragment n'ont pas fonctionné pour moi.

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

Maintenant, nous configurons 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(); // nécessaire pour afficher la carte immédiatement

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

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

                // Pour afficher un bouton de déplacement vers mon emplacement
                googleMap.setMyLocationEnabled(true);

                // Pour déposer un marqueur à un point sur la carte
                LatLng sydney = new LatLng(-34, 151);
                googleMap.addMarker(new MarkerOptions().position(sydney).title("Titre du marqueur").snippet("Description du marqueur"));

                // Pour zoomer automatiquement sur l'emplacement du marqueur
                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 pour votre application en enregistrant votre application sur Google Cloud Console. Enregistrez votre application en tant qu'application Android native.

149voto

user3898069 Points 61

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;

/**
 * Un fragment qui lance d'autres parties de l'application de démonstration.
 */
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

82voto

Maddy Points 227

Vous pouvez utiliser cette ligne si vous voulez utiliser GoogleMap dans un fragment :

GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();

51voto

OWADVL Points 790

Dernières nouveautés avec getMapAsync au lieu de l'ancienne méthode dépréciée.

1. vérifier le manifeste pour

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

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

ou la hauteur que vous voulez

3. Dans onCreateView de 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 // FAITES DE CECI CE QUE VOUS VOULEZ

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

                }

            }
        });

10voto

dharmx Points 307

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

À partir de là, vous pouvez obtenir la clé d'API Google Maps

autre moyen simple

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

dépendance trouvée dans l'activité de carte par défaut dans Android Studio :

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

mettez votre clé dans le fichier manifeste Android sous l'application comme ci-dessous

dans AndroidMainifest.xml, apportez ces modifications :

    // permission requise

        // clé d'API Google Maps à mettre sous/à l'intérieur de 
        // android:value="VOTRE CLÉ D'API"

Code du fragment :

public class MainBranchFragment extends Fragment implements OnMapReadyCallback{

private GoogleMap mMap;
    public MainBranchFragment() {
        // Constructeur public vide requis
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate le layout pour ce 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("VOTRE TITRE")).showInfoWindow();

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

        }
    }

dans votre XML de fragment :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X