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?

5voto

Arshu Points 2160

Pour le problème de recevoir une NullPointerException lors du changement des onglets dans un FragmentTabHost, vous devez simplement ajouter ce code à votre classe qui a le TabHost. Je veux dire la classe où vous initialisez les onglets. Voici le code :

/**** Solution pour l'erreur : Activité a été détruite, lors de l'utilisation d'onglets imbriqués
 * En fait, nous détachons ce fragment d'onglet du `ChildFragmentManager`
 * donc lorsque cet onglet interne est revu, le fragment est réattaché à nouveau ****/

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);
    }
}

4voto

Vaishali Points 359
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

3voto

user1396018 Points 56

Lorsque vous ajoutez votre carte, utilisez :

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

au lieu de .add et au lieu de getFragmentManager.

3voto

Gilboot Points 576

C'est la façon Kotlin :

Dans fragment_map.xml vous devriez avoir :

Dans votre MapFragment.kt vous devriez avoir :

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

Appelez setupMap() dans onCreateView.

1voto

Shreck Ye Points 178

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 de la vue à 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 disposition racine dans votre fragment (de préférence un FrameLayout). L'avantage d'utiliser un fragment de carte est que la durée de vie de la carte est automatiquement gérée par le système.

Bien que la documentation indique "Vous ne pouvez pas gonfler une mise en page dans un fragment lorsque cette mise en page inclut un . Les fragments imbriqués ne sont pris en charge que lorsqu'ils sont ajoutés à un fragment dynamiquement. ", j'ai réussi d'une manière ou d'une autre à le faire 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 :

J'espère que cela vous aidera !

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