在片段中使用Google Map v2的推荐方法是什么?

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

  1. 我可以使用将添加SupportMapFragment的ChildFragmentManager来实现。 我目前正在使用此方法。 但它有缺点,因为子片段事务是异步的,很难保证getMap不会返回null。
  2. 另一种方法是从超级onCreateView扩展SupportMapFragment存储mapView

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

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

有没有其他方法来解决这个问题。 如果谷歌地图团队的某个人会推荐正确的方法,那将是很好的,因为你没有在样本中包含这样的东西。

所有FragmentTransaction都是异步的。 如果您希望您的交易立即发生,您必须强制执行以下操作:

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

来自Android开发者网站 :

使用FragmentTransaction.commit()提交FragmentTransaction.commit() ,它将被安排在进程的主线程上异步执行。 如果要立即执行任何此类挂起操作,可以调用此函数(仅从主线程)来执行此操作。 请注意,所有回调和其他相关行为都将在此调用中完成,因此请注意调用它的位置。

返回
如果要执行任何挂起的事务,则返回true。

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

即您的布局可能如下所示:

    

您还需要将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; } } } }