Cómo poner Google Maps V2 en un Fragmento usando ViewPager

138

Estoy tratando de hacer un diseño de pestaña igual en Play Store. Pude mostrar el diseño de la pestaña usando fragmentos y un visor de androidhive. Sin embargo, no puedo implementar google maps v2 en él. Ya busqué en Internet durante horas, pero no puedo encontrar un tutorial sobre cómo hacerlo. ¿Alguien puede mostrarme cómo?

Jeongbebs
fuente
3
Es curioso que tenga que volver a la pregunta que hice hace 3 años para recordar cómo implementarlo.
Jeongbebs
No hay mucha diferencia entre implementar esto para Activityy Fragmentuna vez que getChildFragmentManager()se usó.
NecipAllef

Respuestas:

320

Al usar este código, podemos configurar MapView en cualquier lugar, dentro de cualquier ViewPager o Fragment o Activity.

En la última actualización de Google for Maps, solo MapView es compatible con fragmentos. MapFragment & SupportMapFragment no funciona. Podría estar equivocado, pero esto es lo que vi después de intentar implementar MapFragment & SupportMapFragment.

Configurar el diseño para mostrar el mapa en el archivo 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>

Ahora, codificamos la clase Java para mostrar el mapa en el archivo 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();
    }
}

Finalmente, necesita obtener la clave API para su aplicación registrándola en Google Cloud Console . Registre su aplicación como aplicación nativa de Android.

arshu
fuente
2
<uses-library android:name="com.google.android.maps" android:required="true" />es para Maps V1, no Maps V2. Habrá dispositivos en el futuro que no tengan la com.google.android.mapsbiblioteca de firmware pero que sean perfectamente capaces de mostrar mapas de Maps V2. Tener esta línea en su manifiesto evitará que se ejecute en dichos dispositivos, y esta línea no es necesaria para el uso de Maps V2. Por ejemplo, los 17 proyectos en github.com/commonsguy/cw-omnibus/tree/master/MapsV2 no tienen este <uses-library>elemento y funcionan bien.
CommonsWare
77
obtengo un error al usar este método. PID de ayuda: 16260 java.lang.NullPointerException en com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) en com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72) el código está aquí: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
Imran Ahmed
77
Me sale un error "NullPointerException" en mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
aletede91
44
La pieza de código de ejemplo: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); se bloqueará en getMap () si findFragmentById () devuelve nulo.
Gunnar Forsgren - Mobimation
2
Si esto no funciona: 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

El siguiente enfoque funciona para mí.

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
fuente
8
eres un genio, me salvaste la vida. mMapView.onResume (); // necesitaba que el mapa se mostrara de inmediato era la clave
Stephane
1
Sigo recibiendo el mismo error java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Pensé que el intento de captura se encargaría de esto. ¿Alguien me puede ayudar?
@BrandonYang, ese es un hombre increíble ... Pude resolver la combinación de cajón de navegación y mapa de manera muy simple ... ¡¡Saludos !!
Sreehari
@BrandonYang: ¿Sabe por qué necesita llamar manualmente a todas las devoluciones de llamada del ciclo de vida mMapView?
Christian Aichinger
66
getMap()es obsoleto. Utilice getMapAsync y onMapReadyCallback en su lugar: stackoverflow.com/a/31371953/4549776
jmeinke
80

Puede usar esta línea si desea usarla GoogleMapen un fragmento:

<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
fuente
44
¡Gracias por su respuesta! todas las demás respuestas no funcionan con las últimas bibliotecas de soporte
Kamil Nekanowicz
1
¿Es una buena práctica llamar a un fragmento dentro de un fragmento? ¿Cómo afecta esto el rendimiento de la aplicación y el buen diseño del software?
AouledIssa
49

Últimas cosas con en getMapAsynclugar de la obsoleta.

1. verifique el manifiesto para

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

Puede obtener la clave API para su aplicación registrándola en Google Cloud Console. Registre su aplicación como aplicación nativa de Android

2. en su diseño de fragmento .xml agregue FrameLayout (no fragmento):

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

o cualquier altura que quieras

3. En onCreateView en tu fragmento

    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
fuente
3
Gracias. Ahorre mucho tiempo, esta es la respuesta correcta según las últimas actualizaciones de la biblioteca.
Sam
Para mí no funcionó. Pasé tanto tiempo para notar que, en el diseño debería estar en <fragmentlugar deFrameLayout
user3448282
En mi opinión, hay un pequeño pero importante error en el código. Debe haber FragmentManager fragmentManager = getChildFragmentManager (); en lugar de getFragmentManager al agregar SupportMapFragment. Como el código es ahora, el fragmento del mapa siempre se agrega cuando se llama a onCreateView (lo cual es malo, ya que no mantiene el estado del mapa). Además, ¡llamaría a getMapAsync solo en la rama mSupportmapFragment == null para realizar la configuración inicial solo una vez!
user1299412
@ user1299412 man, puedes editar la publicación y actualizaré la respuesta. :)
OWADVL
Cuando cambié la SupportMapFragmenten MapFragmentla actividad, cambió el FrameLayouten fragmenten el archivo de diseño y y cambió el com.google.android.gms.maps.SupportMapFragmenten com.google.android.gms.maps.MapFragmentlo bien que funciona para mí. Antes de estos cambios no funcionó. Tal vez esto ayude a otros ...
CodeNinja
10

Aquí lo que hice en detalle:

Desde aquí puede obtener la clave de API de Google Map

forma alternativa y sencilla

primero inicie sesión en su cuenta de Google y visite las bibliotecas de Google y seleccione Google Maps Android API

dependencia encontrada en la actividad del mapa predeterminado de Android Studio:

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

ponga su clave en el archivo mainifest de Android bajo la aplicación como a continuación

en AndroidMainifest.xml realice estos cambios:

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

Código de fragmento:

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

        }
    }

en tu fragmento 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
fuente
`gMapFragment.getMapAsync` tiene una referencia no resuelta en getMapAsync. Esto no funciona
Peter Wey y
¿Estás en actividad o fragmento?
dharmx
¡esto funciona! ¡pero no estoy seguro de si llamar a un fragmento dentro de un fragmento es una buena práctica o no! Por favor avise
AouledIssa
5

Para el problema de obtener un NullPointerExceptioncuando cambiamos las pestañas en un FragmentTabHostsolo necesita agregar este código a su clase que tiene el TabHost. Me refiero a la clase donde inicializas las pestañas. Este es el código:

/**** 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
fuente
¿Qué debo importar en el tipo "Campo"? Hay muchas posibilidades
Jeongbebs
¿Debo enviarte mi proyecto? y tal vez dime que hacer?
Jeongbebs
proyecto enviado a su correo electrónico.
Jeongbebs
no ha agregado google-play-service.jar a su proyecto y también debe cambiar project.properties de "target = android-18" a "target = Google Inc.: API de Google: 18"
arshu
1
Este error se está rastreando en el rastreador de problemas de código abierto de Android: 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) {

    }

}

en 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
fuente
¿hay alguna manera de mover el fragmento del mapa detrás de otro fragmento, por ejemplo? fragmento de menú? Es de alguna manera refrescante y enviar mi fragmento de menú hacia atrás en lugar de quedarse atrás.
sitilge
¿Qué quieres hacer en realidad?
Vaishali Sutariya
3

Cuando agrega su mapa, use:

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

en lugar de .addy en lugar de getFragmentManager.

usuario1396018
fuente
1

Acabo de crear MapActivity e inflarlo en fragmentos. 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
fuente
¿Qué? ¿no que?
rexxar
0

Tengo una solución alternativa para NullPointerExceptioncuando elimine el fragmento DestoryView, solo ponga su código en onStop()no onDestoryView. ¡Funciona 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
fuente
0

De acuerdo con https://developer.android.com/about/versions/android-4.2.html#NestedFragments , puede usar fragmentos anidados para lograr esto llamando a getChildFragmentManager () si aún desea usar el fragmento de Google Maps en lugar del ver dentro de tu propio fragmento:

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

donde "contenido" es el diseño raíz en su fragmento (preferiblemente un FrameLayout). La ventaja de utilizar un fragmento de mapa es que el sistema gestiona automáticamente el ciclo de vida del mapa.

Aunque la documentación dice "No se puede inflar un diseño en un fragmento cuando ese diseño incluye un <fragmento>. Los fragmentos anidados solo son compatibles cuando se agregan dinámicamente a un fragmento", de alguna manera lo hice con éxito y funcionó bien. Aquí está mi código:
en el método onCreateView () del fragmento:

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

En el diseño:

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

¡Espero eso ayude!

Shreck Ye
fuente
0

Agregar dinámicamente un fragmento de mapa para ver el Localizador:

Si está apuntando a una aplicación anterior al nivel de API 12, haga una instancia de SupportedMapFragment y agréguela a su adaptador de página de visualización.

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

El nivel de API 12 o superior admite objetos MapFragment

MapFragment mMapFragment=MapFragment.newInstance();
            mMapFragment.getMapAsync(this);
Adeeb karim
fuente
0

Este es el camino de Kotlin:

En fragment_map.xmldeberías tener:

<?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" />

En tu MapFragment.ktdeberías tener:

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

Llamar setupMap()en onCreateView.

Ssenyonjo
fuente