How to put Google Maps V2 on a Fragment using ViewPager

前端 未结 13 1929
攒了一身酷
攒了一身酷 2020-11-22 04:56

I am trying to do a tab layout same in Play Store. I got to display the tab layout using a fragments and viewpager from androidhive. However, I can\'t implement google maps

相关标签:
13条回答
  • 2020-11-22 05:29

    When you add yor map use:

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

    instead of .add and instead of getFragmentManager.

    0 讨论(0)
  • 2020-11-22 05:30

    You can use this line if you want to use GoogleMap in a fragment:

    <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();
    
    0 讨论(0)
  • 2020-11-22 05:30

    Latest stuff with getMapAsync instead of the deprecated one.

    1. check manifest for

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

    You can get the API Key for your app by registering your app at Google Cloud Console. Register your app as Native Android App

    2. in your fragment layout .xml add FrameLayout(not 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" />
    

    or whatever height you want

    3. In onCreateView in your fragment

        private SupportMapFragment mSupportMapFragment; 
    
        mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere);
        if (mSupportMapFragment == null) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mSupportMapFragment = SupportMapFragment.newInstance();
            fragmentTransaction.replace(R.id.mapwhere, mSupportMapFragment).commit();
        }
    
        if (mSupportMapFragment != null)
        {
            mSupportMapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override public void onMapReady(GoogleMap googleMap) {
                    if (googleMap != null) {
    
                        googleMap.getUiSettings().setAllGesturesEnabled(true);
    
                          -> marker_latlng // MAKE THIS WHATEVER YOU WANT
    
                            CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(15.0f).build();
                            CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
                            googleMap.moveCamera(cameraUpdate);
    
                    }
    
                }
            });
    
    0 讨论(0)
  • 2020-11-22 05:31

    The following approach works for me.

    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" />
    
    0 讨论(0)
  • 2020-11-22 05:35

    I've a workaround for NullPointerException when remove fragment in on DestoryView, Just put your code in onStop() not onDestoryView. It works fine!

    @Override
    public void onStop() {
        super.onStop();
        if (mMap != null) {
            MainActivity.fragmentManager.beginTransaction()
                    .remove(MainActivity.fragmentManager.findFragmentById(R.id.location_map)).commit();
            mMap = null;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 05:36

    here what i did in detail:

    From here you can get google map api key

    alternative and simple way

    first log in to your google account and visit google libraries and select Google Maps Android API

    dependency found in android studio default map activity :

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

    put your key into android mainifest file under application like below

    in AndroidMainifest.xml make these changes:

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

    Fragment code :

    public class MainBranchFragment extends Fragment implements OnMapReadyCallback{
    
    private GoogleMap mMap;
        public MainBranchFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view= inflater.inflate(R.layout.fragment_main_branch, container, false);
            SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.main_branch_map);
            mapFragment.getMapAsync(this);
            return view;
        }
    
    
    
    
         @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                LatLng UCA = new LatLng(-34, 151);
                mMap.addMarker(new MarkerOptions().position(UCA).title("YOUR TITLE")).showInfoWindow();
    
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(UCA,17));
    
            }
        }
    

    in you fragment xml :

    <fragment
                    android:id="@+id/main_branch_map"
                    android:name="com.google.android.gms.maps.SupportMapFragment"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    tools:context="com.googlemap.googlemap.MapsActivity" />
    
    0 讨论(0)
提交回复
热议问题