Como colocar o Google Maps V2 em um fragmento usando o ViewPager

138

Estou tentando fazer o mesmo layout da guia na Play Store. Eu consegui exibir o layout da guia usando fragmentos e viewpager do androidhive. No entanto, não consigo implementar o google maps v2 nele. Eu pesquisei na internet por horas já, mas não consigo encontrar um tutorial sobre como fazê-lo. Alguém pode me mostrar como?

Jeongbebs
fonte
3
é engraçado ter que voltar à pergunta que fiz há três anos para me lembrar de como implementá-la.
Jeongbebs 13/09/16
Não há muita diferença entre implementar isso para Activitye Fragmentuma vez que getChildFragmentManager()foi usado.
NecipAllef #

Respostas:

320

Usando esse código, podemos configurar o MapView em qualquer lugar, dentro de qualquer ViewPager, Fragmento ou Atividade.

Na atualização mais recente do Google for Maps, apenas o MapView é suportado para fragmentos. MapFragment & SupportMapFragment não funciona. Posso estar errado, mas foi o que vi depois de tentar implementar o MapFragment & SupportMapFragment.

Configurando o layout para mostrar o mapa no arquivo 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>

Agora, codificamos a classe Java para mostrar o mapa no arquivo 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();
    }
}

Por fim, você precisa obter a chave da API para seu aplicativo registrando-o no Google Cloud Console . Registre seu aplicativo como aplicativo nativo para Android.

arshu
fonte
2
<uses-library android:name="com.google.android.maps" android:required="true" />é para o Maps V1, não para o Maps V2. No futuro, haverá dispositivos que não possuem a com.google.android.mapsbiblioteca de firmware, mas são perfeitamente capazes de mostrar mapas do Maps V2. Ter essa linha em seu manifesto impedirá a execução nesses dispositivos, e essa linha não é necessária para o uso do Maps V2. Por exemplo, os 17 projetos em github.com/commonsguy/cw-omnibus/tree/master/MapsV2 não possuem esse <uses-library>elemento e funcionam bem.
CommonsWare
7
Estou recebendo erro ao usar este método. por favor, ajude PID: 16260 java.lang.NullPointerException em com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) em com.example.imran.maps.MeFragment.onCreateView O código (MeFragment.java:72) está aqui: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
precisa saber é o seguinte
7
Eu recebo um erro "NullPointerException" no mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
precisa saber é o seguinte
4
O código de exemplo: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); falhará em getMap () se findFragmentById () retornar nulo.
Gunnar Forsgren - Mobimation
2
Sim, isso não 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

A abordagem a seguir funciona para mim.

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
fonte
8
você é um gênio, você salvou minha vida. mMapView.onResume (); // necessário para que o mapa fosse exibido imediatamente era a chave #
Stephane
1
Eu continuo recebendo o mesmo erro java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Eu pensei que o try catch iria cuidar disso. Alguém pode me ajudar?
@BrandonYang isso é incrível, cara. Consegui resolver a combinação de gavetas e mapas de navegação de maneira muito simples ... Saúde !!
Sreehari
@BrandonYang: Você sabe por que precisa chamar manualmente todos os retornos de chamada do ciclo de vida mMapView?
Christian Aichinger
6
getMap()está obsoleto. Use getMapAsync e onMapReadyCallback: stackoverflow.com/a/31371953/4549776
jmeinke 19/16
80

Você pode usar esta linha se desejar usar GoogleMapem um 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
fonte
4
Obrigado pela resposta! todas as outras respostas não funcionar com as últimas bibliotecas de apoio
Kamil Nekanowicz
1
chamar um fragmento dentro de um fragmento é uma boa prática? como isso afeta o desempenho do aplicativo e o bom design de software?
AouledIssa
49

Coisas mais recentes com em getMapAsyncvez da obsoleta.

1. verifique o manifesto

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

Você pode obter a Chave da API do seu aplicativo registrando-o em Google Cloud Console. Registre seu aplicativo como aplicativo nativo para Android

2. No layout do seu fragmento .xml, adicione FrameLayout (não 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" />

ou qualquer altura que você quiser

3. No onCreateView no seu 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
fonte
3
Obrigado, economize muito tempo, esta é a resposta correta hoje, com as atualizações mais recentes da biblioteca.
Sam
Para mim, não funcionou. Passei tanto tempo para perceber que, lá no layout deve ser <fragmentem vez deFrameLayout
user3448282
Na IMO, há um erro pequeno mas importante no código. Deve haver FragmentManager fragmentManager = getChildFragmentManager (); em vez de getFragmentManager ao adicionar o SupportMapFragment. Como o código é agora, o fragmento do mapa é sempre adicionado quando onCreateView é chamado (o que é ruim, pois não mantém o estado do mapa). Além disso, eu chamaria getMapAsync apenas no ramo mSupportmapFragment == null para executar as configurações iniciais apenas uma vez!
user1299412
@ user1299412 cara, você pode editar a postagem e atualizarei a resposta. :)
OWADVL
Quando mudei o SupportMapFragmentpara MapFragmentdentro da atividade, mudei FrameLayoutpara fragmento arquivo de layout e o mudei com.google.android.gms.maps.SupportMapFragmentpara com.google.android.gms.maps.MapFragmentele, funciona bem para mim. Antes dessas mudanças, não funcionava. Talvez isso ajude outros ....
CodeNinja
10

aqui o que eu fiz em detalhes:

A partir daqui, você pode obter a chave API do Google Map

maneira alternativa e simples

primeiro faça login na sua conta do google, visite as bibliotecas do google e selecione API Android do Google Maps

dependência encontrada na atividade de mapa padrão do android studio:

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

coloque sua chave no arquivo mainifest android em aplicação como abaixo

no AndroidMainifest.xml faça essas alterações:

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

        }
    }

em você fragmentar 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
fonte
O `gMapFragment.getMapAsync` possui uma referência não resolvida em getMapAsync. Isso não funciona.
Peter Weyand
você está em atividade ou fragmento?
Dharmx
isso funciona! mas não tenho certeza se chamar um fragmento dentro de um fragmento é uma boa prática ou não! Por favor, informe
AouledIssa
5

Para a questão de obter um NullPointerExceptionquando alteramos as guias em um, FragmentTabHostvocê só precisa adicionar esse código à sua classe que possui o TabHost. Quero dizer a classe em que você inicializa as guias. Este é o 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
fonte
o que devo importar no tipo "Campo"? Existem muitas possibilidades.
21413 Jeongbebs
devo enviar meu projeto para você? e então talvez me diga o que fazer?
21413 Jeongbebs
projeto enviado para o seu email.
21413 Jeongbebs
você não adicionou o google-play-service.jar ao seu projeto e também precisa alterar o project.properties de "target = android-18" para "target = Google Inc.:Google APIs: 18"
arshu
1
Este bug está sendo rastreado no rastreador de problemas de código aberto do 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) {

    }

}

em 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
fonte
existe uma maneira de mover o fragmento do mapa para trás de outro fragmento, por exemplo. fragmento de menu? De alguma forma, é refrescante e envia meu fragmento de menu para trás, em vez de ficar para trás.
Sitlge
O que você quer fazer na verdade?
Vaishali Sutariya
3

Quando você adiciona seu mapa, use:

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

em vez de .adde em vez de getFragmentManager.

user1396018
fonte
1

Acabei de criar MapActivity e inflar para fragmentar. 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
fonte
que? não o quê?
rexxar 23/06
0

Eu tenho uma solução alternativa para NullPointerExceptionquando remover fragmento em DestoryView, basta colocar o seu código onStop()não onDestoryView. Funciona bem!

@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
fonte
0

De acordo com https://developer.android.com/about/versions/android-4.2.html#NestedFragments , você pode usar fragmentos aninhados para conseguir isso chamando getChildFragmentManager () se ainda quiser usar o fragmento do Google Maps em vez do veja dentro de seu próprio fragmento:

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

onde "conteúdo" é o layout raiz do seu fragmento (de preferência um FrameLayout). A vantagem de usar um fragmento de mapa é que o ciclo de vida do mapa é gerenciado automaticamente pelo sistema.

Embora a documentação diga "Você não pode inflar um layout em um fragmento quando esse layout inclui um <fragmento>. Fragmentos aninhados são suportados apenas quando adicionados dinamicamente a um fragmento"., De alguma forma, fiz isso com êxito e funcionou bem. Aqui está o meu código:
No método onCreateView () do fragmento:

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

No layout:

<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 que ajude!

Shreck Ye
fonte
0

Adicionando dinamicamente fragmento de mapa para visualizar o Pager:

Se você estiver direcionando para um aplicativo anterior ao nível 12 da API, crie uma instância do SupportedMapFragment e adicione-o ao seu adaptador de página de visualização.

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

A API nível 12 ou superior suporta objetos MapFragment

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

Esta é a maneira Kotlin:

Em fragment_map.xmlvocê deve ter:

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

No seu MapFragment.ktvocê deve ter:

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

Chamada setupMap()no onCreateView.

Ssenyonjo
fonte