ViewPager का उपयोग करके Google मैप्स V2 को फ्रैगमेंट पर कैसे रखा जाए


138

मैं प्ले स्टोर में एक टैब लेआउट समान करने की कोशिश कर रहा हूं। मुझे एंड्रॉइड से टुकड़े और व्यूपैगर का उपयोग करके टैब लेआउट प्रदर्शित करना था हालाँकि, मैं इस पर गूगल मैप्स v2 को लागू नहीं कर सकता । मैंने पहले से ही घंटों इंटरनेट खोजा, लेकिन मैं इसे कैसे करना है पर एक ट्यूटोरियल नहीं ढूंढ सकता। क्या कोई मुझे दिखा सकता है कि कैसे?


3
यह मज़ेदार है कि मुझे उस प्रश्न पर वापस जाना होगा जो मैंने 3 साल पहले पूछा था ताकि मैं इसे याद कर सकूं कि इसे कैसे लागू किया जाए।
Jeongbebs

इसे लागू करने Activityऔर Fragmentएक बार getChildFragmentManager()उपयोग करने के बीच बहुत अंतर नहीं है।
NecipAllef

जवाबों:


320

इस कोड का उपयोग करके हम किसी भी ViewPager या Fragment या गतिविधि के अंदर, MapView को कहीं भी सेटअप कर सकते हैं।

मैप्स के लिए 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>

अब, हम फ़ाइल में नक्शा दिखाने के लिए जावा क्लास को कोड करते हैं 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 क्लाउड कंसोल पर अपने ऐप को पंजीकृत करके अपने ऐप के लिए एपीआई कुंजी प्राप्त करनी होगी । अपने ऐप को मूल निवासी Android ऐप के रूप में पंजीकृत करें।


2
<uses-library android:name="com.google.android.maps" android:required="true" />मैप्स V1 के लिए है, मैप्स V2 नहीं। भविष्य में ऐसे डिवाइस होंगे जिनके पास com.google.android.mapsफर्मवेयर लाइब्रेरी नहीं है, लेकिन मैप्स V2 मैप्स दिखाने में पूरी तरह सक्षम हैं। आपके प्रकट होने में यह रेखा होने से आपको ऐसे उपकरणों पर चलने से रोका जा सकता है, और मैप्स V2 के उपयोग के लिए इस पंक्ति की आवश्यकता नहीं है। उदाहरण के लिए, github.com/commonsguy/cw-omnibus/tree/master/MapsV2 पर 17 परियोजनाओं में यह <uses-library>तत्व नहीं है और यह ठीक काम करता है।
कॉमन्सवेयर

7
मुझे इस विधि का उपयोग करते समय त्रुटि हो रही है। कृपया सहायता PID: 16260 java.lang.NullPointerException पर com.example.imran.maps। (MeFragment.java:72) कोड यहाँ है: googleMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.map))। GetMap ()।
इमरान अहमद

7
मुझे mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map)) पर एक इरोर "NullPointerException" मिलता है। getMap ();
aletede91

4
उदाहरण कोड टुकड़ा: mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById (R.id.location_map))। GetMap (); getMap (बिग) रिटर्न मिल जाए तो getMap () में क्रैश हो जाएगा।
गुन्नार फोर्सग्रेन - मोबिमेशन

2
हाँ यह काम नहीं करता है: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.bo.o()' on a null object reference
पीटर वीएंड

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 (); // मानचित्र को तुरंत प्रदर्शित करने के लिए कुंजी की आवश्यकता थी
स्टीफन

1
मुझे वही त्रुटि मिलती रहती है java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized। मुझे लगा कि कोशिश कैच इस बात का ख्याल रखेगा। क्या कोई मेरी मदद कर सकता है?

@BrandonYang दैट्स कमाल का आदमी है .. मैं बहुत ही सरलता से नेविगेशन दराज और मानचित्र संयोजन को हल करने में सक्षम था ... चीयर्स !!
श्रीहरि २०'१६ को

@BrandonYang: क्या आप जानते हैं कि आपको मैन्युअल रूप से सभी जीवनचक्र कॉलबैक के लिए कॉल करने की आवश्यकता क्यों है mMapView?
क्रिश्चियन आइचिंगर

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
उत्तर देने के लिए आपका शुक्रिया! अन्य सभी प्रतिक्रियाएँ नवीनतम समर्थन पुस्तकालयों के साथ काम नहीं करती हैं
कामिल नेकानोविक्ज़

1
एक टुकड़ा एक अच्छा अभ्यास के अंदर एक टुकड़ा कह रही है? यह एप्लिकेशन के प्रदर्शन और अच्छे सॉफ़्टवेयर डिज़ाइन को कैसे प्रभावित करता है ??
आउलियादीसा

49

getMapAsyncपदावनत के बदले नवीनतम सामग्री ।

1. जाँच के लिए प्रकट

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

आप अपने ऐप पर रजिस्टर करके अपने ऐप के लिए एपीआई कुंजी प्राप्त कर सकते हैं Google Cloud Console। अपने ऐप को मूल निवासी Android ऐप के रूप में पंजीकृत करें

2. अपने खंड लेआउट में .xml फ़्रेमलेयआउट जोड़ें (टुकड़ा नहीं):

                  <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
धन्यवाद, समय की बहुत बचत करें, यह नवीनतम लाइब्रेरी अपडेट के साथ आज के अनुसार सही उत्तर है।
सैम

मेरे लिए यह काम नहीं किया। मैंने यह नोटिस करने के लिए इतना समय बिताया कि, लेआउट में <fragmentइसके बजाय होना चाहिएFrameLayout
user3448282

IMO कोड में एक छोटी लेकिन महत्वपूर्ण गलती है। FragmentManager के टुकड़े होने चाहिए ManManager = 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यह मेरे लिए ठीक काम करता है। इन परिवर्तनों से पहले यह काम नहीं किया था। हो सकता है कि यह दूसरों की मदद करे ....
कोडनिजा

10

यहाँ मैंने विस्तार से क्या किया:

यहाँ से आप google map api key प्राप्त कर सकते हैं

वैकल्पिक और सरल तरीका है

पहले अपने Google खाते में लॉग इन करें और Google पुस्तकालयों पर जाएं और Google मानचित्र Android एपीआई का चयन करें

Android स्टूडियो डिफ़ॉल्ट मानचित्र गतिविधि में निर्भरता मिली:

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

नीचे की तरह आवेदन के तहत 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 का एक अनसुलझा संदर्भ है। यह काम नहीं करता है।
पीटर वीएंड

क्या आप गतिविधि या टुकड़े में हैं?
धर्म

यह काम! लेकिन मुझे यकीन नहीं है कि एक टुकड़े के अंदर एक टुकड़ा कॉल करना एक अच्छा अभ्यास है या नहीं! कृपया सलाह दें
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);
    }
}

मुझे "फ़ील्ड" प्रकार पर क्या आयात करना चाहिए? बहुत संभावनाएं हैं।
Jeongbebs

क्या मुझे आपको अपना प्रोजेक्ट भेजना चाहिए? और फिर शायद मुझे बताएं कि मुझे क्या करना है?
Jeongbebs

प्रोजेक्ट आपके ईमेल पर भेजा गया।
Jeongbebs

yo ने google-play-service.jar को अपने प्रोजेक्ट में शामिल नहीं किया है और आपको प्रोजेक्ट को बदलने की भी आवश्यकता है। आपको "लक्ष्य = android-18" से "लक्ष्य = 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) {

    }

}

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

वहाँ एक और टुकड़ा जैसे उदाहरण के पीछे नक्शा टुकड़ा स्थानांतरित करने के लिए एक रास्ता है। मेनू टुकड़ा? यह किसी भी तरह से ताज़ा है और मेरे मेनू टुकड़े को वापस खुद रहने के बजाय वापस भेज रहा है।
दोपहर

आप वास्तव में क्या करना चाहते हैं?
वैशाली सुतारिया

3

जब आप योर मैप का उपयोग जोड़ते हैं:

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

}

क्या? नहीं क्या?
पुनर्जन्म

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 के अनुसार , यदि आप अभी भी Google मैप्स टुकड़े का उपयोग करना चाहते हैं, तो getChildFragmentManager () को कॉल करके इसे प्राप्त करने के लिए नेस्टेड टुकड़ों का उपयोग कर सकते हैं । अपने खुद के टुकड़े के अंदर देखें:

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

जहां "सामग्री" आपके टुकड़े में मूल लेआउट है (अधिमानतः एक फ्रेम-आउट)। मानचित्र के टुकड़े का उपयोग करने का लाभ यह है कि तब सिस्टम द्वारा मानचित्र जीवनचक्र स्वचालित रूप से प्रबंधित किया जाता है।

हालाँकि, दस्तावेज़ कहता है कि "आप किसी लेआउट को उस खंड में नहीं बढ़ा सकते जब उस लेआउट में एक <टुकड़ा> शामिल हो। किसी खंड को गतिशील रूप से जोड़े जाने पर समर्थित होते हैं।" यहाँ मेरा कोड है:
टुकड़ा 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);

एपीआई स्तर 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.