Cách đặt Google Maps V2 trên Fragment bằng ViewPager


138

Tôi đang cố gắng thực hiện một bố cục tab giống nhau trong Play Store. Tôi phải hiển thị bố cục tab bằng cách sử dụng một đoạn và viewpager từ androidhive. Tuy nhiên, tôi không thể triển khai google maps v2 trên đó. Tôi đã tìm kiếm trên mạng hàng giờ rồi, nhưng tôi không thể tìm thấy hướng dẫn về cách thực hiện. Ai đó có thể vui lòng chỉ cho tôi làm thế nào?


3
thật buồn cười khi tôi phải quay lại câu hỏi tôi đã hỏi 3 năm trước để tôi có thể nhớ về cách thực hiện nó.
Jeongbebs

Không có nhiều khác biệt giữa việc thực hiện điều này cho ActivityFragmentmột lần getChildFragmentManager()được sử dụng.
NecipAllef

Câu trả lời:


320

Bằng cách sử dụng mã này, chúng tôi có thể thiết lập MapView ở bất cứ đâu, bên trong bất kỳ ViewPager hoặc Fragment hoặc Activity nào.

Trong bản cập nhật mới nhất của Google cho Bản đồ, chỉ MapView được hỗ trợ cho các đoạn. MapFragment & SupportMapFragment không hoạt động. Tôi có thể sai nhưng đây là những gì tôi thấy sau khi thử triển khai MapFragment & SupportMapFragment.

Thiết lập bố cục để hiển thị bản đồ trong tệp 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>

Bây giờ, chúng tôi mã lớp Java để hiển thị bản đồ trong tệp 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();
    }
}

Cuối cùng, bạn cần lấy Khóa API cho ứng dụng của mình bằng cách đăng ký ứng dụng của bạn tại Google Cloud Console . Đăng ký ứng dụng của bạn dưới dạng Ứng dụng Android gốc.


2
<uses-library android:name="com.google.android.maps" android:required="true" />dành cho Bản đồ V1, không phải Bản đồ V2. Sẽ có những thiết bị trong tương lai không có com.google.android.mapsthư viện phần sụn nhưng hoàn toàn có khả năng hiển thị bản đồ Maps V2. Có dòng này trong bảng kê khai của bạn sẽ ngăn bạn chạy trên các thiết bị đó và dòng này không bắt buộc để sử dụng Bản đồ V2. Ví dụ: 17 dự án tại github.com/commonsguy/cw-omnibus/tree/master/MapsV2 không có <uses-library>yếu tố này và hoạt động tốt.
CommonsWare

7
Tôi đang gặp lỗi trong khi sử dụng phương thức này. Xin vui lòng trợ giúp Mã (MeFragment.java:72) có tại đây: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). GetMap ();
Imran Ahmed

7
Tôi nhận được một lỗi "NullPulumException" trên mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap ();
alavee91

4
Đoạn mã ví dụ: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). GetMap (); sẽ gặp sự cố trong getMap () nếu findFragmentById () trả về null.
Gunnar Forsgren - Mobimation

2
Vâng, điều này không hoạt động: 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

Cách tiếp cận sau đây làm việc cho tôi.

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
bạn là một thiên tài, bạn đã cứu cuộc đời tôi mMapView.onResume (); // cần thiết để hiển thị bản đồ ngay lập tức là chìa khóa
Stephane

1
Tôi tiếp tục nhận được cùng một lỗi java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized. Tôi nghĩ rằng việc thử bắt sẽ quan tâm đến điều này. Ai đó có thể giúp tôi không?

@BrandonYang đó là người đàn ông tuyệt vời .. Tôi đã có thể giải quyết ngăn kéo điều hướng và kết hợp bản đồ rất đơn giản ... Chúc mừng !!
Sreehari

@BrandonYang: Bạn có biết tại sao bạn cần gọi thủ công tất cả các cuộc gọi lại vòng đời cho mMapView?
Christian Aichinger

6
getMap()bị phản đối Thay vào đó, hãy sử dụng getMapAsync và onMapReadyCallback: stackoverflow.com/a/31371953/4549776
jmeinke

80

Bạn có thể sử dụng dòng này nếu bạn muốn sử dụng GoogleMaptrong một đoạn:

<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
Cảm ơn bạn đã trả lời! tất cả các phản hồi khác không hoạt động với các thư viện hỗ trợ mới nhất
Kamil Nekanowicz

1
gọi một mảnh bên trong một mảnh là một thực hành tốt? Điều này ảnh hưởng đến hiệu suất ứng dụng và Thiết kế phần mềm tốt như thế nào ??
AouledIssa

49

Công cụ mới nhất với getMapAsyncthay vì không dùng nữa.

1. kiểm tra bảng kê khai cho

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

Bạn có thể lấy Khóa API cho ứng dụng của mình bằng cách đăng ký ứng dụng tại Google Cloud Console. Đăng ký ứng dụng của bạn dưới dạng Ứng dụng Android gốc

2. trong bố cục đoạn của bạn .xml thêm FrameLayout (không phải đoạn):

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

hoặc bất cứ chiều cao nào bạn muốn

3. Trong onCreateView trong đoạn của bạn

    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
Cảm ơn, Tiết kiệm nhiều thời gian, đây là câu trả lời chính xác theo ngày hôm nay với các cập nhật thư viện mới nhất.
Sam

Đối với tôi nó đã không làm việc. Tôi đã dành rất nhiều thời gian để nhận thấy rằng, nên có bố cục <fragmentthay vìFrameLayout
user3448282

IMO có một lỗi nhỏ nhưng quan trọng trong mã. Cần có FragmentManager FragmentManager = getChildFragmentManager (); thay vì getFragmentManager khi thêm SupportMapFragment. Vì mã hiện tại, đoạn bản đồ luôn được thêm vào khi onCreateView được gọi (điều này là xấu, vì nó không giữ trạng thái bản đồ). Hơn nữa, tôi sẽ chỉ gọi getMapAsync trong nhánh mSupportmapFragment == null để thực hiện cài đặt ban đầu chỉ một lần!
dùng1299412

@ user1299412, bạn có thể chỉnh sửa bài đăng và tôi sẽ chỉ cập nhật câu trả lời. :)
OWADVL

Khi tôi thay đổi SupportMapFragmentthành MapFragmenttrong hoạt động, thay đổi FrameLayoutthành fragmenttrong tệp bố cục và thay đổi com.google.android.gms.maps.SupportMapFragmentthành com.google.android.gms.maps.MapFragmenthoạt động tốt cho tôi. Trước những thay đổi này, nó không hoạt động. Có lẽ điều này giúp người khác ....
CodeNinja

10

đây là những gì tôi đã làm chi tiết:

Từ đây bạn có thể lấy chìa khóa api google map

cách thay thế và đơn giản

đầu tiên đăng nhập vào tài khoản google của bạn và truy cập các thư viện google và chọn API Google Maps Android

phụ thuộc được tìm thấy trong hoạt động bản đồ mặc định của studio android:

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

đưa khóa của bạn vào tập tin chính của Android theo ứng dụng như bên dưới

trong AndroidMainifest.xml thực hiện các thay đổi này:

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

Mã phân đoạn:

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

        }
    }

trong đoạn bạn 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` có một tham chiếu chưa được giải quyết trên getMapAsync. Điều này không hoạt động.
Peter Weyand

bạn đang hoạt động hay mảnh vỡ?
dharmx

những công việc này! nhưng tôi không chắc việc gọi một mảnh bên trong một mảnh có phải là một thực hành tốt hay không! Xin tư vấn
AouledIssa

5

Đối với vấn đề nhận được NullPointerExceptionkhi chúng tôi thay đổi Tab trong một FragmentTabHostbạn chỉ cần thêm mã này vào lớp có TabHost. Tôi có nghĩa là lớp nơi bạn khởi tạo các tab. Đây là mã:

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

Tôi nên nhập gì vào loại "Trường"? Có nhiều khả năng.
Jeongbebs

Tôi có nên gửi cho bạn dự án của tôi? và sau đó có thể cho tôi biết phải làm gì?
Jeongbebs

dự án gửi đến email của bạn.
Jeongbebs

bạn chưa thêm google-play-service.jar vào dự án của mình và bạn cũng cần thay đổi dự án.properations từ "target = android-18" thành "target = Google Inc .: Google API: 18"
arshu

1
Lỗi này đang được theo dõi trong trình theo dõi sự cố Nguồn mở 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) {

    }

}

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

có cách nào để di chuyển đoạn bản đồ phía sau một đoạn khác, vd. mảnh thực đơn? Đó là bằng cách nào đó làm mới và gửi mảnh menu của tôi trở lại thay vì ở lại chính nó.
sitilge 3/2/2015

Những gì bạn muốn làm thực sự?
Vaishali Sutariya

3

Khi bạn thêm bản đồ yor, hãy sử dụng:

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

thay vì .addvà thay vì getFragmentManager.


1

tôi chỉ cần tạo MapActivity và thổi phồng nó thành từng mảnh. 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;
    }

}

gì? không gì?
rexxar

0

Tôi đã một workaround cho NullPointerExceptionkhi đoạn remove ở trên DestoryView, Chỉ cần đặt mã của bạn trong onStop()không onDestoryView. Nó hoạt động tốt!

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

0

Theo https://developer.android.com/about/versions/android-4.2.html#NestedFragments , bạn có thể sử dụng các đoạn lồng nhau để đạt được điều này bằng cách gọi getChildFragmentManager () nếu bạn vẫn muốn sử dụng đoạn Google Maps thay vì xem bên trong đoạn của riêng bạn:

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

trong đó "nội dung" là bố cục gốc trong đoạn của bạn (tốt nhất là FrameLayout). Ưu điểm của việc sử dụng một đoạn bản đồ là sau đó vòng đời bản đồ được hệ thống quản lý tự động.

Mặc dù tài liệu nói rằng "Bạn không thể thổi phồng bố cục thành một đoạn khi bố cục đó bao gồm <đoạn>. Các đoạn lồng nhau chỉ được hỗ trợ khi được thêm vào một đoạn động", nhưng bằng cách nào đó tôi đã thực hiện thành công điều này và nó hoạt động tốt. Đây là mã của tôi:
Trong phương thức onCreateView () của đoạn:

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

Trong cách bố trí:

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

Hy vọng nó giúp!


0

Tự động thêm đoạn bản đồ để xem Pager:

Nếu bạn đang nhắm mục tiêu một ứng dụng sớm hơn API cấp 12, hãy tạo một phiên bản của ManagedMapFragment và thêm nó vào bộ điều hợp trang xem của bạn.

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

API cấp 12 trở lên hỗ trợ các đối tượng MapFragment

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

0

Đây là cách của Kotlin:

Trong fragment_map.xmlbạn nên có:

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

Trong MapFragment.ktbạn nên có:

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

Gọi setupMap()trong onCreateView.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.