如何使用ViewPager将Google Maps V2放在片段上

Jeo*_*ebs 129 android google-maps android-fragments

我正在尝试在Play商店中进行相同的标签布局.我必须使用来自androidhive的片段和viewpager来显示标签布局.但是,我无法在其上实现谷歌地图v2.我已经在互联网上搜索了好几个小时,但我找不到如何做的教程.有人可以告诉我怎么样?

ars*_*shu 295

通过使用此代码,我们可以在任何ViewPager或Fragment或Activity中的任何位置设置MapView.

在谷歌地图的最新更新中,只有片段支持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>
Run Code Online (Sandbox Code Playgroud)

现在,我们编写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();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您需要通过在Google云端控制台注册您的应用来获取应用的API密钥.将您的应用注册为原生Android应用.

  • 我在使用此方法时遇到错误.请帮助PID:16260 java.lang.NullPointerException com.example.imran.maps.MeFragment.setUpMapIfNeeded(MeFragment.java:115)at com.example.imran.maps.MeFragment.onCreateView (MeFragment.java:72)代码在这里:googleMap =((SupportMapFragment)MainActivity.fragmentManager .findFragmentById(R.id.map)).getMap(); (7认同)
  • 我在mMap =((SupportMapFragment)MainActivity.fragmentManager .findFragmentById(R.id.location_map))上得到一个错误的"NullPointerException".getMap(); (7认同)
  • 示例代码段:mMap =((SupportMapFragment)MainActivity.fragmentManager .findFragmentById(R.id.location_map)).getMap(); 如果findFragmentById()返回null,将在getMap()中崩溃. (4认同)
  • `<uses-library android:name ="com.google.android.maps"android:required ="true"/>`适用于地图V1,而非地图V2.未来将有一些设备没有`com.google.android.maps`固件库,但完全能够显示Maps V2地图.在清单中包含此行将阻止您在此类设备上运行,并且Maps V2使用时不需要此行.例如,https://github.com/commonsguy/cw-omnibus/tree/master/MapsV2上的17个项目没有这个`<uses-library>`元素并且工作正常. (2认同)
  • 是的,这不起作用:`java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.impl.bo.o()' on a null object reference` (2认同)

Bra*_*ang 142

以下方法适用于我.

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();
}
}
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

  • 你是天才,你救了我的命.mMapView.onResume(); //需要立即显示地图才是关键 (8认同)
  • `getMap()`已弃用.改为使用getMapAsync和onMapReadyCallback:http://stackoverflow.com/a/31371953/4549776 (5认同)

Mad*_*ddy 78

如果要GoogleMap在片段中使用,可以使用此行:

<fragment
            android:id="@+id/map"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment" />
Run Code Online (Sandbox Code Playgroud)

GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的答案!所有其他响应不适用于最新的支持库 (4认同)

OWA*_*DVL 49

最新的东西,getMapAsync而不是被弃用的东西.

检查清单

<meta-data android:name="com.google.android.geo.API_KEY" android:value="xxxxxxxxxxxxxxxxxxxxxxxxx"/>
Run Code Online (Sandbox Code Playgroud)

您可以通过注册您的应用来获取应用的API密钥Google Cloud Console.将您的应用注册为原生Android应用

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" />
Run Code Online (Sandbox Code Playgroud)

或者你想要的任何高度

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

                }

            }
        });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,节省了大量时间,这是今天最新的库更新的正确答案. (3认同)

dha*_*rmx 10

这里我做了详细的事情:

从这里你可以获得谷歌地图API密钥

另类和简单的方法

首先登录您的Google帐户并访问Google图书馆并选择Google Maps Android API

android studio默认地图活动中发现的依赖关系:

compile 'com.google.android.gms:play-services:10.0.1'
Run Code Online (Sandbox Code Playgroud)

把你的密钥放到android 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" />
Run Code Online (Sandbox Code Playgroud)

片段代码:

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

你片段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" />
Run Code Online (Sandbox Code Playgroud)


ars*_*shu 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);
    }
}
Run Code Online (Sandbox Code Playgroud)