android - 如何在 fragment 中使用谷歌地图 V2?

标签 android google-maps-android-api-2

我有一个 fragment ,它是 Viewpager 的一部分,我想在该 fragment 中使用 Google Map V2。这是我迄今为止尝试过的,

在我的 fragment 中,

    private SupportMapFragment map;
      private GoogleMap mMapView;

   @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        FragmentManager fm = getChildFragmentManager();
        map = (SupportMapFragment) fm.findFragmentById(R.id.map);
        if (map == null) {
            map = SupportMapFragment.newInstance();
            fm.beginTransaction().replace(R.id.map, map).commit();
        }



    }

    @Override
    public void onResume() {
        super.onResume();
        if (mMapView == null) {
            mMapView = map.getMap();
            Marker hamburg = mMapView.addMarker(new MarkerOptions().position(HAMBURG)
                      .title("Hamburg"));
                  Marker kiel = mMapView.addMarker(new MarkerOptions()
                      .position(KIEL)
                      .title("Kiel")
                      .snippet("Kiel is cool")
                      .icon(BitmapDescriptorFactory
                          .fromResource(R.drawable.ic_launcher)));


                  mMapView.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));

                  // Zoom in, animating the camera.
           mMapView.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);


        }
    }

在我的布局 subfragment_info.xml 中,我有,

<fragment
            android:id="@+id/map"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/tableLayout1" />

我现在可以看到 map 了。但是标记没有显示。我认为我的谷歌地图 mMapView 是空的。请帮我解决这个问题。提前致谢。

最佳答案

为 map 创建一个框架,将其添加到您的 xml 布局中

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map_container">

<!-- The map fragments will go here --> 
</RelativeLayout>

不要在 xml 中包含 class="com.google.android.gms.maps.SupportMapFragment" 在您的 fragment 类中,请在 onActivityCreated 中手动获取它

    @Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm = getChildFragmentManager();
    fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
    if (fragment == null) {
        fragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.map_container, fragment).commit();
    }


/***at this time google play services are not initialize so get map and add what ever you want to it in onResume() or onStart() **/
}

@Override
    public void onResume() {
        super.onResume();
        if (map == null) {
            map = fragment.getMap();
            map.addMarker(new MarkerOptions().position(new LatLng(0, 0)));
        }
    }

如果你们遇到任何问题 Illegal State Exception Occur 只需写下面的代码

/* * 此问题在 (Google Bugs) 中跟踪 * http://code.google.com/p/gmaps-api-issues/issues/detail?id=5064添加 * 再次点击选项卡时出现非法状态异常代码 * *为我修复它的短期解决方法是将以下内容添加到 * 你调用的每个 Fragment 的 onDetach() */

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

//如果你想在 Activity 中显示 map ,只需通过//FragmentActivity 编写下面提到的代码来扩展你的 Activity

在 onCreate 中

FragmentManager fm = getSupportFragmentManager();
        fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container);
        if (fragment == null) {
            fragment = SupportMapFragment.newInstance();
            fm.beginTransaction().replace(R.id.map_container, fragment)
                    .commit();
    }

在 onResume 中

@Override
    protected void onResume() {
        super.onResume();
        if (googleMap == null) {
            initilizeMap();

        }
    }

private void initilizeMap() {
        if (googleMap != null) {

            googleMap = fragment.getMap();
            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            googleMap.getUiSettings().setMyLocationButtonEnabled(true);
            googleMap.getUiSettings().setCompassEnabled(true);
            googleMap.getUiSettings().setRotateGesturesEnabled(true);

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(latitude, longitude)).zoom(10).build();
            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            // create marker
            MarkerOptions marker = new MarkerOptions().position(new LatLng(
                    latitude, longitude));
            // ROSE color icon
            marker.icon(BitmapDescriptorFactory
                    .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
            // adding marker
            googleMap.addMarker(marker);

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }

可以从这些链接获得更多帮助
https://code.google.com/p/gmaps-api-issues/issues/detail?id=5064#c1 https://developers.google.com/maps/documentation/android/map

关于android - 如何在 fragment 中使用谷歌地图 V2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18206615/

相关文章:

java - GoogleMap V2 错误 android.view.InflateException : Binary XML file line #7: Error inflating class fragment

android - 如何在使用 Cordova 3.1 构建的 Android 应用程序中获取 Mac 地址

javascript - 为什么我的英特尔 xdk 应用程序无法在 Android 上运行?

android - 如何在android后台加载谷歌地图?

android - 如何使用 android google map sdk v2 绘制虚线折线?

android - android 中需要 Google api 客户端参数

android - 删除 android ListView 的底部分隔线

android - 从服务器获取动画资源

java - 图像流中的帧是什么?

android - Google Maps API (Android) – 在缩放标记的边缘之间绘制多段线