Cara menempatkan Google Maps V2 pada Fragmen menggunakan ViewPager

138

Saya mencoba melakukan tata letak tab yang sama di Play Store. Saya harus menampilkan tata letak tab menggunakan fragmen dan viewpager dari androidhive. Namun, saya tidak dapat menerapkan google maps v2 di atasnya. Saya sudah mencari di internet selama berjam-jam, tetapi saya tidak dapat menemukan tutorial tentang cara melakukannya. Bisakah seseorang tunjukkan caranya?

Jeongbebs
sumber
3
itu lucu bahwa saya harus kembali ke pertanyaan yang saya tanyakan 3 tahun yang lalu sehingga saya dapat mengingat bagaimana menerapkannya.
Jeongbebs
Tidak ada banyak perbedaan antara menerapkan ini untuk Activitydan Fragmentpernah getChildFragmentManager()digunakan.
NecipAllef

Jawaban:

320

Dengan menggunakan kode ini kita dapat mengatur MapView di mana saja, di dalam ViewPager atau Fragmen atau Aktivitas apa pun.

Di pembaruan terbaru Google untuk Maps, hanya MapView yang didukung untuk fragmen. MapFragment & SupportMapFragment tidak berfungsi. Saya mungkin salah tetapi ini yang saya lihat setelah mencoba mengimplementasikan MapFragment & SupportMapFragment.

Menyiapkan tata letak untuk menampilkan peta dalam file 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>

Sekarang, kami memberi kode pada kelas Java untuk menampilkan peta dalam file 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();
    }
}

Akhirnya Anda perlu mendapatkan Kunci API untuk aplikasi Anda dengan mendaftarkan aplikasi Anda di Google Cloud Console . Daftarkan aplikasi Anda sebagai Aplikasi Android Asli.

arshu
sumber
2
<uses-library android:name="com.google.android.maps" android:required="true" />untuk Maps V1, bukan Maps V2. Akan ada perangkat di masa depan yang tidak memiliki com.google.android.mapsperpustakaan firmware tetapi sangat mampu menampilkan peta Maps V2. Memiliki baris ini di manifes Anda akan mencegah Anda berjalan di perangkat tersebut, dan baris ini tidak diperlukan untuk penggunaan Maps V2. Misalnya, 17 proyek di github.com/commonsguy/cw-omnibus/tree/master/MapsV2 tidak memiliki <uses-library>elemen ini dan berfungsi dengan baik.
CommonsWare
7
saya mendapatkan kesalahan saat menggunakan metode ini. Tolong bantu PID: 16260 java.lang.NullPointerException di com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) di com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72) kode ada di sini: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
Imran Ahmed
7
Saya mendapatkan errore "NullPointerException" di mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
aletede91
4
Sepotong kode contoh: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); akan macet di getMap () jika findFragmentById () mengembalikan nol.
Gunnar Forsgren - Mobimation
2
Ya ini tidak berhasil: 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

Pendekatan berikut bekerja untuk saya.

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
sumber
8
Anda jenius, Anda menyelamatkan hidup saya. mMapView.onResume (); // diperlukan agar peta segera ditampilkan adalah kuncinya
Stephane
1
Saya terus mendapatkan kesalahan yang sama java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Saya pikir coba tangkap akan mengatasi ini. Adakah yang bisa membantu saya?
@BrandonYang, itu pria yang luar biasa .. Saya dapat menyelesaikan laci navigasi dan kombinasi peta dengan sangat sederhana ... Ceria !!
Sreehari
@BrandonYang: Apakah Anda tahu mengapa Anda harus secara manual memanggil semua callback daur hidup mMapView?
Christian Aichinger
6
getMap()sudah ditinggalkan. Gunakan getMapAsync dan onMapReadyCallback sebagai gantinya: stackoverflow.com/a/31371953/4549776
jmeinke
80

Anda dapat menggunakan baris ini jika Anda ingin menggunakannya GoogleMapdalam sebuah fragmen:

<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
sumber
4
Terimakasih untuk jawaban! semua tanggapan lain tidak berfungsi dengan perpustakaan dukungan terbaru
Kamil Nekanowicz
1
apakah menyebut fragmen di dalam fragmen adalah praktik yang baik? bagaimana ini mempengaruhi kinerja aplikasi dan desain perangkat lunak yang baik ??
AouledIssa
49

Barang-barang terbaru dengan getMapAsyncbukannya yang sudah usang.

1. periksa manifes

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

Anda bisa mendapatkan Kunci API untuk aplikasi Anda dengan mendaftarkan aplikasi Anda di Google Cloud Console. Daftarkan aplikasi Anda sebagai Aplikasi Android Asli

2. di tata letak fragmen Anda .xml tambahkan FrameLayout (bukan fragmen):

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

atau apa pun ketinggian yang Anda inginkan

3. Di onCreateView di fragmen Anda

    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
sumber
3
Terima kasih, Hemat banyak waktu, ini adalah jawaban yang tepat hari ini dengan pembaruan perpustakaan terbaru.
Sam
Bagi saya itu tidak berhasil. Saya menghabiskan begitu banyak waktu untuk memperhatikan bahwa, ada dalam tata letak seharusnya <fragmentbukanFrameLayout
user3448282
IMO ada kesalahan kecil tapi penting dalam kode. Harus ada FragmentManager fragmentManager = getChildFragmentManager (); bukannya getFragmentManager saat menambahkan SupportMapFragment. Karena kode sekarang, fragmen peta selalu ditambahkan ketika onCreateView dipanggil (yang buruk, karena tidak mempertahankan status peta). Lebih lanjut, saya akan memanggil getMapAsync hanya di cabang mSupportmapFragment == null untuk melakukan pengaturan awal hanya sekali!
user1299412
@ user1299412 man, Anda dapat mengedit posting, dan saya hanya akan memperbarui jawabannya. :)
OWADVL
Ketika saya mengubah SupportMapFragmentke MapFragmentdalam aktivitas, mengubah FrameLayoutke fragmentdalam file tata letak dan dan mengubahnya com.google.android.gms.maps.SupportMapFragmentmenjadi com.google.android.gms.maps.MapFragmentberfungsi dengan baik untuk saya. Sebelum perubahan ini tidak berhasil. Mungkin ini membantu orang lain ....
CodeNinja
10

di sini apa yang saya lakukan secara detail:

Dari sini Anda bisa mendapatkan kunci api peta google

cara alternatif dan sederhana

masuk terlebih dahulu ke akun google Anda dan kunjungi perpustakaan Google dan pilih Google Maps Android API

Ketergantungan ditemukan dalam aktivitas peta default Android Studio:

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

masukkan kunci Anda ke file android mainifest di bawah aplikasi seperti di bawah ini

di AndroidMainifest.xml lakukan perubahan ini:

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

Kode fragmen:

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

        }
    }

di dalam kamu fragmen 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
sumber
`gMapFragment.getMapAsync` memiliki referensi yang belum terselesaikan di getMapAsync. Ini tidak berhasil.
Peter Weyand
apakah Anda dalam kegiatan atau fragmen?
dharmx
ini bekerja! tetapi saya tidak yakin apakah memanggil fragmen di dalam fragmen adalah praktik yang baik atau tidak! Mohon saran
AouledIssa
5

Untuk masalah mendapatkan NullPointerExceptionketika kami mengubah Tab di, FragmentTabHostAnda hanya perlu menambahkan kode ini ke kelas Anda yang memiliki TabHost. Maksud saya kelas tempat Anda menginisialisasi tab. Ini kodenya:

/**** 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
sumber
apa yang harus saya impor pada tipe "Field"? Ada banyak kemungkinan.
Jeongbebs
haruskah saya mengirimkan Anda proyek saya? dan kemudian mungkin katakan padaku apa yang harus dilakukan?
Jeongbebs
proyek dikirim ke email Anda.
Jeongbebs
Anda belum menambahkan google-play-service.jar ke proyek Anda & Anda juga perlu mengubah properti.properti dari "target = android-18" menjadi "target = Google Inc.:Google APIs: 18"
arshu
1
Bug ini sedang dilacak dalam pelacak masalah Open Source 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) {

    }

}

di 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
sumber
apakah ada cara untuk memindahkan fragmen peta di belakang fragmen lain misalnya. fragmen menu? Entah bagaimana menyegarkan dan mengirim fragmen menu saya untuk kembali, bukan tetap kembali itu sendiri.
sitilge
Apa yang ingin Anda lakukan sebenarnya?
Vaishali Sutariya
3

Saat Anda menambahkan, gunakan peta:

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

bukannya .adddan bukannya getFragmentManager.

pengguna1396018
sumber
1

saya hanya membuat MapActivity dan mengembang menjadi fragmen. 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
sumber
apa? tidak ..... apa?
rexxar
0

Aku punya solusi untuk NullPointerExceptionsaat menghapus fragmen di atas DestoryView, Hanya menempatkan kode Anda di onStop()tidak onDestoryView. Ini bekerja dengan baik!

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

Menurut https://developer.android.com/about/versions/android-4.2.html#NestedFragments , Anda dapat menggunakan fragmen bersarang untuk mencapai ini dengan memanggil getChildFragmentManager () jika Anda masih ingin menggunakan fragmen Google Maps daripada lihat di dalam fragmen Anda sendiri:

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

di mana "konten" adalah tata letak root di fragmen Anda (lebih disukai FrameLayout). Keuntungan menggunakan fragmen peta adalah bahwa siklus hidup peta dikelola secara otomatis oleh sistem.

Meskipun dokumentasi mengatakan "Anda tidak dapat mengembang tata letak menjadi sebuah fragmen ketika tata letak itu termasuk <fragment>. Fragmen bersarang hanya didukung ketika ditambahkan ke fragmen secara dinamis.", Saya entah bagaimana berhasil melakukan ini dan itu berfungsi dengan baik. Ini kode saya:
Di metode onCreateView () fragmen:

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

Dalam tata letak:

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

Semoga ini bisa membantu!

Shreck Ye
sumber
0

Menambahkan fragmen peta secara dinamis untuk melihat Pager:

Jika Anda menargetkan aplikasi lebih awal dari API level 12, buat instance SupportedMapFragment dan tambahkan ke adaptor halaman tampilan Anda.

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

API level 12 atau lebih tinggi mendukung objek MapFragment

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

Ini adalah cara Kotlin:

Di fragment_map.xmlAnda harus memiliki:

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

Di Anda, MapFragment.ktAnda harus memiliki:

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

Sebut setupMap()di onCreateView.

Ssenyonjo
sumber