ViewPager를 사용하여 Google Maps V2를 조각에 배치하는 방법


138

Play 스토어에서 동일한 탭 레이아웃을 시도하고 있습니다. androidhive의 조각과 viewpager를 사용하여 탭 레이아웃 을 표시해야합니다 . 그러나 Google지도 v2 를 구현할 수 없습니다 . 이미 몇 시간 동안 인터넷을 검색했지만 그 방법에 대한 자습서를 찾을 수 없습니다. 어떤 분이 방법을 보여 주시겠습니까?


3
3 년 전에 물었던 질문으로 돌아가서 구현 방법을 기억할 수 있다는 것은 재밌습니다.
Jeongbebs

이것을 구현 한 Activity것과 Fragment한 번 getChildFragmentManager()사용 된 것 사이에는 큰 차이가 없습니다 .
NecipAllef

답변:


320

이 코드를 사용하여 ViewPager, Fragment 또는 Activity 내 어디에서나 MapView를 설정할 수 있습니다.

Google for Maps의 최신 업데이트에서는 조각에 대해 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();
    }
}

마지막으로 Google Cloud Console에 앱을 등록하여 앱의 API 키를 가져와야 합니다. 앱을 기본 Android 앱으로 등록하십시오.


2
<uses-library android:name="com.google.android.maps" android:required="true" />Maps V2가 아니라 Maps V1 용입니다. 향후에는 com.google.android.maps펌웨어 라이브러리가 없지만 Maps V2 맵을 완벽하게 표시 할 수있는 장치가 있습니다. 매니페스트에이 줄이 있으면 이러한 기기에서 실행할 수 없으며이 줄은 Maps V2 사용에 필요하지 않습니다. 예를 들어, github.com/commonsguy/cw-omnibus/tree/master/MapsV2 의 17 개 프로젝트 에는이 <uses-library>요소 가 없으며 제대로 작동합니다.
CommonsWare

7
이 방법을 사용하는 동안 오류가 발생했습니다 .PID : 16260 com.example.imran.maps.MeFragment.setUpMapIfNeeded (MeFragment.java:115) com.example.imran.maps.MeFragment.onCreateView에서 PID : 16260 java.lang.NullPointerException (MeFragment.java:72) 코드는 다음과 같습니다. googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map)). getMap ();
Imran Ahmed

7
mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). getMap ()에서 "NullPointerException"오류가 발생합니다.
aletede91

4
예제 코드 조각 : mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)). getMap (); findFragmentById ()가 null을 반환하면 getMap ()에서 충돌이 발생합니다.
Gunnar Forsgren-Mobimation

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. 앱을 기본 Android 앱으로 등록

2. 조각 레이아웃 .xml에서 FrameLayout (fragment 아님)을 추가하십시오.

                  <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 ()가 있어야합니다. SupportMapFragment를 추가 할 때 getFragmentManager 대신에. 코드가 작성되었으므로 onCreateView가 호출 될 때 맵 조각이 항상 추가됩니다 (맵 상태를 유지하지 않기 때문에 나쁩니다). 또한 mSupportmapFragment == null 분기에서만 getMapAsync를 호출하여 초기 설정을 한 번만 수행합니다!
user1299412

@ user1299412 남자, 당신은 게시물을 편집 할 수 있으며, 나는 대답을 업데이트 할 것입니다. :)
OWADVL

내가 변경하는 경우 SupportMapFragmentMapFragment활동에서 변경 FrameLayout으로 fragment레이아웃 파일과 변경된 com.google.android.gms.maps.SupportMapFragmentcom.google.android.gms.maps.MapFragment나를 위해 잘 작동합니다. 이러한 변경 전에는 작동하지 않았습니다. 어쩌면 이것은 다른 사람들을 도울 수 있습니다 ....
CodeNinja

10

여기 내가 세부적으로 한 일 :

여기에서 당신은 구글지도 API 키를 얻을 수 있습니다

대안적이고 간단한 방법

먼저 Google 계정에 로그인하고 Google 라이브러리를 방문 하여 Google Maps Android API를 선택하십시오.

android studio 기본 맵 활동에서 발견 된 종속성 :

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

아래와 같은 응용 프로그램에서 안드로이드 mainifest 파일에 키를 넣으십시오.

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
크리스토퍼 존슨에게

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

yor 맵을 추가 할 때 :

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

대신에 .add대신에 getFragmentManager.


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 () 를 호출 하여 여전히 자신의 조각 내부를 봅니다.

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

Pager를보기 위해 동적으로 맵 조각 추가 :

API 레벨 12 이전의 애플리케이션을 대상으로하는 경우 SupportedMapFragment의 인스턴스를 작성하여보기 페이지 어댑터에 추가하십시오.

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

API 레벨 12 이상은 MapFragment 객체를 지원합니다

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

0

이것이 코 틀린 방식입니다.

에서에게 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.