วิธีวาง Google Maps V2 ใน Fragment โดยใช้ ViewPager


138

ฉันพยายามทำเค้าโครงแท็บเหมือนกันใน Play Store ฉันต้องแสดงเลย์เอาต์ของแท็บโดยใช้ชิ้นส่วนและวิวเพจจาก androidhive อย่างไรก็ตามฉันไม่สามารถใช้google maps v2กับมันได้ ฉันค้นหาทางอินเทอร์เน็ตเป็นเวลาหลายชั่วโมงแล้ว แต่ฉันไม่สามารถหาบทเรียนเกี่ยวกับวิธีการทำ บางคนช่วยแสดงให้ฉันดูได้อย่างไร


3
เป็นเรื่องตลกที่ฉันต้องย้อนกลับไปยังคำถามที่ฉันถามเมื่อ 3 ปีก่อนเพื่อให้ฉันจำได้ว่าจะนำไปใช้อย่างไร
Jeongbebs

ไม่แตกต่างกันมากนักระหว่างการนำสิ่งนี้ไปใช้ActivityและFragmentเมื่อgetChildFragmentManager()ใช้งานแล้ว
NecipAllef

คำตอบ:


320

โดยใช้รหัสนี้เราสามารถติดตั้ง MapView ได้ทุกที่ภายใน ViewPager หรือ Fragment หรือ Activity

ในการอัปเดตล่าสุดของ Google สำหรับแผนที่สนับสนุน MapView เฉพาะสำหรับแฟรกเมนต์ MapFragment & SupportMapFragment ไม่ทำงาน ฉันอาจจะผิด แต่นี่คือสิ่งที่ฉันเห็นหลังจากพยายามใช้ MapFragment & SupportMapFragment

การตั้งค่าเลย์เอาต์สำหรับแสดงแผนที่ในไฟล์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>

ตอนนี้เราโค้ดคลาส Java เพื่อแสดงแผนที่ในไฟล์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();
    }
}

ในที่สุดคุณต้องได้รับคีย์ API สำหรับแอปของคุณโดยการลงทะเบียนของแอปที่คอนโซล Google Cloud ลงทะเบียนแอพของคุณเป็น Native Android App


2
<uses-library android:name="com.google.android.maps" android:required="true" />ใช้สำหรับ Maps V1 ไม่ใช่ Maps V2 จะมีอุปกรณ์ในอนาคตที่ไม่มีcom.google.android.mapsห้องสมุดเฟิร์มแวร์ แต่สามารถแสดงแผนที่ Maps V2 ได้อย่างสมบูรณ์แบบ การมีบรรทัดนี้ในรายการของคุณจะทำให้คุณไม่สามารถทำงานบนอุปกรณ์ดังกล่าวได้และไม่จำเป็นต้องใช้สายนี้ในการใช้ Maps V2 ตัวอย่างเช่นโครงการ 17 โครงการที่github.com/commonsguy/cw-omnibus/tree/master/MapsV2ไม่มี<uses-library>องค์ประกอบนี้และทำงานได้ดี
CommonsWare

7
ฉันได้รับข้อผิดพลาดขณะใช้วิธีนี้โปรดช่วย PID: 16260 java.lang.NullPointerException ที่ com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) ที่ com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72) โค้ดอยู่ที่นี่: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). getMap ();
Imran Ahmed

7
ฉันได้รับ errore "NullPointerException" บน mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)) getMap ();
aletede91

4
ตัวอย่างรหัสชิ้น: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). getMap (); จะผิดพลาดใน getMap () ถ้า findFragmentById () ส่งคืน null
Gunnar Forsgren - การเคลื่อนไหว

2
ใช่สิ่งนี้ไม่ทำงาน: 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

วิธีการต่อไปนี้ใช้งานได้สำหรับฉัน

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

8
คุณเป็นอัจฉริยะคุณช่วยชีวิตฉันไว้ mMapView.onResume (); // จำเป็นต้องได้รับแผนที่เพื่อแสดงทันทีคือกุญแจ
Stephane

1
java.lang.NullPointerException: IBitmapDescriptorFactory is not initializedฉันได้รับข้อผิดพลาดเดียวกัน ฉันคิดว่าลองจับจะดูแลเรื่องนี้ มีคนช่วยฉันได้ไหม

@BrandonYang นั่นเป็นคนที่ยอดเยี่ยม .. ฉันสามารถแก้ไขการนำทางลิ้นชักและการรวมแผนที่ได้อย่างง่ายดายมาก ... ไชโย !!
Sreehari

@BrandonYang: คุณรู้ว่าทำไมคุณจะต้องเรียกตนเองทั้งหมดเรียกกลับวงจรสำหรับmMapView?
Christian Aichinger

6
getMap()เลิกใช้แล้ว ใช้ getMapAsync และ onMapReadyCallback แทน: stackoverflow.com/a/31371953/4549776
jmeinke

80

คุณสามารถใช้บรรทัดนี้หากคุณต้องการใช้GoogleMapในส่วน:

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

4
ขอบคุณสำหรับคำตอบ! คำตอบอื่น ๆ ทั้งหมดไม่ทำงานกับห้องสมุดสนับสนุนล่าสุด
Kamil Nekanowicz

1
การเรียกชิ้นส่วนภายในส่วนเป็นแนวปฏิบัติที่ดีหรือไม่? สิ่งนี้มีผลต่อประสิทธิภาพของแอพและการออกแบบซอฟต์แวร์ที่ดีอย่างไร?
AouledIssa

49

สิ่งล่าสุดด้วยgetMapAsyncแทนที่จะเป็นสิ่งที่เลิกใช้แล้ว

1. ตรวจสอบรายการสำหรับ

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

คุณจะได้รับคีย์ API Google Cloud Consoleสำหรับแอปของคุณโดยการลงทะเบียนของแอปที่ ลงทะเบียนแอพของคุณเป็น Native Android App

2. ในเลย์เอาต์ .xml ของคุณเพิ่ม FrameLayout (ไม่ใช่ส่วน)

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

หรืออะไรก็ได้ที่คุณต้องการ

3. ใน onCreateView ในแฟรกเมนต์ของคุณ

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

                }

            }
        });

3
ขอขอบคุณประหยัดเวลามากนี่เป็นคำตอบที่ถูกต้องตามวันนี้พร้อมอัปเดตห้องสมุดล่าสุด
Sam

สำหรับฉันมันไม่ทำงาน ฉันใช้เวลามากในการสังเกตว่าควรมีรูปแบบ<fragmentแทนFrameLayout
user3448282

IMO มีข้อผิดพลาดเล็กน้อย แต่สำคัญในรหัส ควรมี FragmentManager FragmentManager = getChildFragmentManager (); แทน getFragmentManager เมื่อเพิ่ม SupportMapFragment เนื่องจากรหัสอยู่ในขณะนี้ส่วนแผนที่จะถูกเพิ่มเสมอเมื่อเรียก onCreateView (ซึ่งไม่ดีเนื่องจากมันไม่ได้รักษาสถานะของแผนที่) นอกจากนี้ฉันจะเรียก getMapAsync เฉพาะใน mSupportmapFragment สาขา == null เพื่อทำการตั้งค่าเริ่มต้นเพียงครั้งเดียว!
user1299412

@ user1299412 ชายคุณสามารถแก้ไขโพสต์และฉันจะอัปเดตคำตอบ :)
OWADVL

เมื่อฉันเปลี่ยนSupportMapFragmentเป็นMapFragmentในกิจกรรมให้เปลี่ยนFrameLayoutเป็นfragmentในไฟล์เลย์เอาต์และเปลี่ยนcom.google.android.gms.maps.SupportMapFragmentเป็นcom.google.android.gms.maps.MapFragmentมันทำงานได้ดีสำหรับฉัน ก่อนการเปลี่ยนแปลงเหล่านี้จะไม่ทำงาน บางทีนี่อาจช่วยผู้อื่น ....
CodeNinja

10

นี่คือสิ่งที่ฉันทำในรายละเอียด:

จากที่นี่คุณสามารถรับรหัส google map api

ทางเลือกและวิธีที่ง่าย

ก่อนเข้าสู่บัญชี google ของคุณและไปที่ห้องสมุด google และเลือก Google Maps Android API

พบการพึ่งพาในกิจกรรมแผนที่เริ่มต้นของ android studio:

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

ใส่รหัสของคุณลงในไฟล์ mainifest Android ภายใต้แอปพลิเคชันด้านล่าง

ใน AndroidMainifest.xml ทำการเปลี่ยนแปลงเหล่านี้:

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

รหัสส่วน:

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

        }
    }

ในส่วนของคุณ 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" />

`gMapFragment.getMapAsync` มีการอ้างอิงที่ไม่ได้รับการแก้ไขใน getMapAsync มันใช้งานไม่ได้
Peter Weyand

คุณอยู่ในกิจกรรมหรือส่วน
dharmx

ใช้งานได้! แต่ฉันไม่แน่ใจว่าการเรียกชิ้นส่วนภายในชิ้นส่วนเป็นการฝึกปฏิบัติที่ดีหรือไม่! โปรดแนะนำ
AouledIssa

5

สำหรับปัญหาของการที่NullPointerExceptionเมื่อเราเปลี่ยนแท็บในคุณเพียงแค่ต้องเพิ่มรหัสนี้ในชั้นเรียนของคุณซึ่งมีFragmentTabHost TabHostฉันหมายถึงคลาสที่คุณเริ่มต้นแท็บ นี่คือรหัส:

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

ฉันควรนำเข้าอะไรในประเภท "Field" มีความเป็นไปได้มากมาย
Jeongbebs

ฉันควรส่งโครงการให้ฉัน แล้วอาจจะบอกฉันว่าจะทำอย่างไร?
Jeongbebs

ส่งโครงการไปยังอีเมลของคุณแล้ว
Jeongbebs

yo ยังไม่ได้เพิ่ม google-play-service.jar ในโครงการของคุณและคุณต้องเปลี่ยน project.properties จาก "target = android-18" เป็น "target = Google Inc. : Google API: 18"
arshu

1
ข้อผิดพลาดนี้กำลังถูกติดตามในตัวติดตามปัญหาการใช้งานโอเพนซอร์ส: 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) {

    }

}

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

มีวิธีย้ายชิ้นส่วนแผนที่ด้านหลังชิ้นส่วนอื่น ๆ หรือไม่ ส่วนย่อยของเมนู? มันสดชื่นและส่งแฟรกเมนต์เมนูของฉันกลับคืน
sitilge

สิ่งที่คุณต้องการทำจริง
Vaishali Sutariya

3

เมื่อคุณเพิ่มแผนที่เล็กน้อยใช้:

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

แทนและแทนที่จะ.addgetFragmentManager


1

ฉันแค่สร้าง MapActivity แล้วขยายมันออกเป็นส่วน ๆ 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;
    }

}

อะไร? ไม่มีอะไร?
rexxar

0

ฉันได้วิธีแก้ปัญหาสำหรับNullPointerExceptionเมื่อส่วนลบในDestoryViewเพียงแค่ใส่รหัสของคุณในไม่ได้onStop() onDestoryViewมันใช้งานได้ดี!

@Override
public void onStop() {
    super.onStop();
    if (mMap != null) {
        MainActivity.fragmentManager.beginTransaction()
                .remove(MainActivity.fragmentManager.findFragmentById(R.id.location_map)).commit();
        mMap = null;
    }
}

0

ตามhttps://developer.android.com/about/versions/android-4.2.html#NestedFragmentsคุณสามารถใช้ชิ้นส่วนที่ซ้อนกันเพื่อให้บรรลุสิ่งนี้ได้โดยการเรียกใช้getChildFragmentManager ()หากคุณยังต้องการใช้ชิ้นส่วน Google Maps แทน ดูภายในชิ้นส่วนของคุณเอง:

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

โดยที่ "content" เป็นโครงร่างรูทในแฟรกเมนต์ของคุณ (ควรเป็น FrameLayout) ข้อดีของการใช้แฟรกเมนต์แผนที่คือระบบจะจัดการวงจรชีวิตของแผนที่โดยอัตโนมัติ

ถึงแม้ว่าเอกสารอธิบายว่า "คุณไม่สามารถขยายเค้าโครงลงในส่วนได้เมื่อโครงร่างนั้นมี <fragment> ชิ้นส่วนที่ซ้อนกันได้รับการสนับสนุนก็ต่อเมื่อมีการเพิ่มส่วนย่อยแบบไดนามิก" ฉันทำสิ่งนี้สำเร็จแล้วและทำงานได้ดี นี่คือรหัสของฉัน:
ในเมธอด onCreateView () ของแฟรกเมนต์:

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

ในรูปแบบ:

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

หวังว่ามันจะช่วย!


0

การเพิ่มส่วนของแผนที่แบบไดนามิกเพื่อดูเพจเจอร์:

หากคุณกำหนดเป้าหมายแอปพลิเคชันก่อนหน้า API ระดับ 12 ให้สร้างอินสแตนซ์ของ SupportedMapFragment และเพิ่มไปยังอะแดปเตอร์หน้ามุมมองของคุณ

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

API ระดับ 12 หรือสูงกว่ารองรับวัตถุ MapFragment

MapFragment mMapFragment=MapFragment.newInstance();
            mMapFragment.getMapAsync(this);

0

นี่คือวิธี Kotlin:

ในที่fragment_map.xmlคุณควรมี:

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

ในของคุณMapFragment.ktคุณควรจะมี:

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

โทรในsetupMap()onCreateView

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.