So platzieren Sie Google Maps V2 mit ViewPager auf einem Fragment

138

Ich versuche, im Play Store ein Tab-Layout zu erstellen. Ich muss das Tab-Layout mit Fragmenten und Viewpager von androidhive anzeigen. Ich kann Google Maps v2 jedoch nicht darauf implementieren . Ich habe bereits stundenlang im Internet gesucht, aber ich kann kein Tutorial dazu finden. Kann mir bitte jemand zeigen wie?

Jeongbebs
quelle
3
Es ist lustig, dass ich zu der Frage zurückkehren muss, die ich vor 3 Jahren gestellt habe, damit ich mich daran erinnern kann, wie ich sie implementieren soll.
Jeongbebs
Es gibt keinen großen Unterschied zwischen der Implementierung für Activityund Fragmenteinmal getChildFragmentManager()verwendet.
NecipAllef

Antworten:

320

Mit diesem Code können wir MapView überall in jedem ViewPager, Fragment oder jeder Aktivität einrichten.

Im neuesten Update von Google for Maps wird nur MapView für Fragmente unterstützt. MapFragment & SupportMapFragment funktioniert nicht. Ich könnte mich irren, aber das habe ich gesehen, nachdem ich versucht habe, MapFragment & SupportMapFragment zu implementieren.

Einrichten des Layouts für die Anzeige der Karte in der Datei 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>

Jetzt codieren wir die Java-Klasse zum Anzeigen der Karte in der Datei 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();
    }
}

Schließlich müssen Sie den API-Schlüssel für Ihre App erhalten, indem Sie Ihre App bei Google Cloud Console registrieren . Registrieren Sie Ihre App als native Android App.

Arshu
quelle
2
<uses-library android:name="com.google.android.maps" android:required="true" />ist für Karten V1, nicht für Karten V2. In Zukunft wird es Geräte geben, die nicht über die com.google.android.mapsFirmware-Bibliothek verfügen, aber perfekt in der Lage sind, Maps V2-Maps anzuzeigen. Wenn Sie diese Zeile in Ihrem Manifest haben, können Sie sie nicht auf solchen Geräten ausführen. Diese Zeile ist für die Verwendung von Maps V2 nicht erforderlich. Zum Beispiel haben die 17 Projekte unter github.com/commonsguy/cw-omnibus/tree/master/MapsV2 dieses <uses-library>Element nicht und funktionieren einwandfrei.
CommonsWare
7
Bei Verwendung dieser Methode wird eine Fehlermeldung angezeigt. Bitte helfen Sie bei PID: 16260 java.lang.NullPointerException unter com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) unter com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72) Code ist hier: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
Imran Ahmed
7
Ich erhalte einen Fehler "NullPointerException" auf mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
Aletede91
4
Das Beispielcodestück: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); stürzt in getMap () ab, wenn findFragmentById () null zurückgibt.
Gunnar Forsgren - Mobimation
2
Ja, das funktioniert nicht: 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

Der folgende Ansatz funktioniert für mich.

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
quelle
8
Du bist ein Genie, du hast mein Leben gerettet. mMapView.onResume (); // benötigt, um die Karte sofort anzuzeigen, war der Schlüssel
Stephane
1
Ich bekomme immer den gleichen Fehler java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Ich dachte, dass der Versuch Fang dafür sorgen würde. Kann mir jemand helfen?
@BrandonYang das ist ein großartiger Mann .. Ich konnte die Kombination aus Navigationsschublade und Karte sehr einfach auflösen ... Prost !!
Sreehari
@BrandonYang: Wissen Sie, warum Sie alle Lebenszyklus-Rückrufe für manuell aufrufen müssen mMapView?
Christian Aichinger
6
getMap()ist veraltet. Verwenden Sie stattdessen getMapAsync und onMapReadyCallback: stackoverflow.com/a/31371953/4549776
jmeinke
80

Sie können diese Zeile verwenden, wenn Sie sie GoogleMapin einem Fragment verwenden möchten :

<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
quelle
4
Danke für die Antwort! Alle anderen Antworten funktionieren nicht mit den neuesten Support-Bibliotheken
Kamil Nekanowicz
1
Ist es eine gute Praxis, ein Fragment innerhalb eines Fragments aufzurufen? Wie wirkt sich dies auf die App-Leistung und das gute Software-Design aus?
AouledIssa
49

Neueste Sachen mit getMapAsyncanstelle der veralteten.

1. Manifest auf prüfen

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

Sie können den API-Schlüssel für Ihre App erhalten, indem Sie Ihre App unter registrieren Google Cloud Console. Registrieren Sie Ihre App als native Android App

2. Fügen Sie in Ihrem Fragment-Layout .xml FrameLayout (kein Fragment) hinzu:

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

oder welche Höhe du willst

3. In onCreateView in Ihrem 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 // 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
quelle
3
Vielen Dank, sparen Sie viel Zeit, dies ist die richtige Antwort wie heute mit den neuesten Bibliotheksaktualisierungen.
Sam
Bei mir hat es nicht geklappt. Ich habe so viel Zeit damit verbracht zu bemerken, dass es im Layout <fragmentstattFrameLayout
user3448282
IMO gibt es einen kleinen, aber wichtigen Fehler im Code. Es sollte FragmentManager geben fragmentManager = getChildFragmentManager (); anstelle von getFragmentManager beim Hinzufügen des SupportMapFragment. Wie der Code jetzt ist, wird das Kartenfragment immer hinzugefügt, wenn onCreateView aufgerufen wird (was schlecht ist, da der Kartenstatus nicht beibehalten wird). Außerdem würde ich getMapAsync nur in der Verzweigung mSupportmapFragment == null aufrufen, um die Anfangseinstellungen nur einmal vorzunehmen!
user1299412
@ user1299412 Mann, Sie können den Beitrag bearbeiten, und ich werde nur die Antwort aktualisieren. :)
OWADVL
Wenn ich das SupportMapFragmentin MapFragmentin der Aktivität geändert habe, habe ich das FrameLayoutin fragmentin der Layoutdatei geändert und das com.google.android.gms.maps.SupportMapFragmentin geändert com.google.android.gms.maps.MapFragment, funktioniert es gut für mich. Vor diesen Änderungen hat es nicht funktioniert. Vielleicht hilft das anderen ...
CodeNinja
10

hier was ich im detail gemacht habe:

Von hier aus können Sie den Google Map API-Schlüssel erhalten

alternativer und einfacher Weg

Melden Sie sich zuerst in Ihrem Google-Konto an, besuchen Sie die Google-Bibliotheken und wählen Sie die Google Maps Android-API aus

Abhängigkeit in Android Studio Standard-Kartenaktivität gefunden:

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

Legen Sie Ihren Schlüssel in die Android Mainifest-Datei unter Anwendung wie unten

Nehmen Sie in AndroidMainifest.xml folgende Änderungen vor:

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

Fragmentcode:

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

        }
    }

in dir fragment 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
quelle
`gMapFragment.getMapAsync` hat einen ungelösten Verweis auf getMapAsync. Das funktioniert nicht.
Peter Weyand
Bist du in Aktivität oder Fragment?
Dharmx
das funktioniert! aber ich bin nicht sicher, ob das Aufrufen eines Fragments innerhalb eines Fragments eine gute Praxis ist oder nicht! Bitte raten Sie
AouledIssa
5

Für das Problem, eine zu erhalten, NullPointerExceptionwenn wir die Registerkarten in einer ändern, FragmentTabHostmüssen Sie diesen Code nur zu Ihrer Klasse hinzufügen, die die hat TabHost. Ich meine die Klasse, in der Sie die Registerkarten initialisieren. Dies ist der Code:

/**** 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
quelle
Was soll ich auf den Typ "Feld" importieren? Es gibt viele Möglichkeiten.
Jeongbebs
soll ich dir mein projekt schicken und dann sag mir vielleicht was zu tun ist?
Jeongbebs
Projekt an Ihre E-Mail gesendet.
Jeongbebs
Sie haben die Datei google-play-service.jar nicht zu Ihrem Projekt hinzugefügt und müssen außerdem die project.properties von "target = android-18" in "target = Google Inc.:Google APIs: 18"
ändern
1
Dieser Fehler wird im Android Open Source Issue Tracker verfolgt: 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) {

    }

}

in 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
quelle
Gibt es eine Möglichkeit, das Kartenfragment hinter ein anderes Fragment zu verschieben, z. Menüfragment? Es ist irgendwie erfrischend und schickt mein Menüfragment zurück, anstatt selbst zurück zu bleiben.
Sitilge
Was willst du eigentlich machen?
Vaishali Sutariya
3

Wenn Sie Ihre Karte hinzufügen, verwenden Sie:

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

statt .addund statt getFragmentManager.

user1396018
quelle
1

Ich erstelle MapActivity und blase es auf, um es zu fragmentieren. 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
quelle
Was? nicht, was?
Rexxar
0

Ich habe eine Problemumgehung für das NullPointerExceptionEntfernen von Fragmenten in DestoryView. Geben Sie einfach Ihren Code onStop()nicht ein onDestoryView. Es funktioniert gut!

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

Laut https://developer.android.com/about/versions/android-4.2.html#NestedFragments können Sie verschachtelte Fragmente verwenden , um dies zu erreichen, indem Sie getChildFragmentManager () aufrufen, wenn Sie weiterhin das Google Maps-Fragment anstelle von verwenden möchten Blick in dein eigenes Fragment:

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

Dabei ist "Inhalt" das Stammlayout in Ihrem Fragment (vorzugsweise ein FrameLayout). Der Vorteil der Verwendung eines Kartenfragments besteht darin, dass der Kartenlebenszyklus dann automatisch vom System verwaltet wird.

Obwohl in der Dokumentation steht "Sie können ein Layout nicht in ein Fragment aufblasen, wenn dieses Layout ein <Fragment> enthält. Verschachtelte Fragmente werden nur unterstützt, wenn sie dynamisch zu einem Fragment hinzugefügt werden.", Aber ich habe dies irgendwie erfolgreich durchgeführt und es hat gut funktioniert. Hier ist mein Code:
In der onCreateView () -Methode des Fragments:

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

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

Ich hoffe es hilft!

Shreck Ye
quelle
0

Dynamisches Hinzufügen eines Kartenfragments zum Anzeigen von Pager:

Wenn Sie auf eine Anwendung vor API Level 12 abzielen, erstellen Sie eine Instanz von SupportedMapFragment und fügen Sie sie Ihrem Ansichtsseitenadapter hinzu.

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

API Level 12 oder höher unterstützen MapFragment-Objekte

MapFragment mMapFragment=MapFragment.newInstance();
            mMapFragment.getMapAsync(this);
Adeeb Karim
quelle
0

Dies ist der Kotlin-Weg:

In fragment_map.xmlsollten Sie haben:

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

In Ihrem MapFragment.ktsollten Sie haben:

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

Rufen Sie setupMap()an onCreateView.

Ssenyonjo
quelle