什么是推荐的方式使用谷歌地图V2内的片段?

我想添加自定义布局片段内的地图。

  1. 我可以使用ChildFragmentManager来添加SupportMapFragment。 我目前正在使用这种方法。 然而它有缺点,因为子片段事务是asynchronous的,它很难保证getMap不会返回null。
  2. 另一种方法是从super onCreateView扩展SupportMapFragment存储mapView

    mapView = super.onCreateView(inflater, container, savedInstanceState);

    并将其插入膨胀的布局。 主要的问题是,然后片段尝试从保存状态恢复谷歌地图SDK内部压碎。

还有别的办法可以解决这个问题吗? 如果Google地图小组的某个人会推荐正确的方法,那将是非常好的,因为您没有在样本中包含这样的内容。

所有的FragmentTransaction都是asynchronous的。 如果您希望您的交易立即发生,您必须像这样强制他们完成:

 getChildFragmentManager().beginTransaction.add(R.id.container, new MyMapFragment(), "MyMapFragment").commit(); getChildFragmentManager().executePendingTransactions(); /* getMap() should not return null here */ 

从Android开发者网站 :

在使用FragmentTransaction.commit()提交FragmentTransaction.commit() ,计划在进程的主线程上asynchronous执行。 如果你想立即执行任何这样的挂起操作,你可以调用这个函数(只能从主线程)来这样做。 请注意,所有的callback和其他相关的行为都将在这个调用中完成,所以要注意从哪里调用。

返回
如果有任何待执行的事务被执行,则返回true。

你可以在你的Fragment(或Activity)中使用MapView ,这将允许你使用任何你想要的布局。

即您的布局可以像这样:

 <FrameLayout 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/map" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

您还需要将Fragment的生命周期方法(如onCreate,onResume等)转发到MapView。

唯一的区别(似乎是Google地图中的错误)是,您还需要手动初始化Google地图:

 private void setUpMapIfNeeded() { if (mMap == null) { mMap = mMapView.getMap(); if (mMap != null) { // Thought official docs says that it is not necessary to call // initialize() method if we got not-null GoogleMap instance from // getMap() method it seems to be wrong in case of MapView class. try { MapsInitializer.initialize(getActivity()); setUpMap(mMap); } catch (GooglePlayServicesNotAvailableException impossible) { mMap = null; } } } }