17

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

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

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

    并将其插入到膨胀的布局中。主要问题是片段尝试从保存的状态恢复 Google Maps SDK 在内部崩溃。

有没有其他方法可以解决这个问题。如果 Google Map 团队的某个人会推荐正确的方法,那就太好了,因为您没有在示例中包含类似的内容。

4

2 回答 2

13

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

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

来自Android 开发者网站

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

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

于 2013-03-07T21:40:19.320 回答
3

您可以在 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 Maps 中的错误?)是您还需要手动初始化 Google Maps:

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;
            }
        }
    }
}
于 2013-03-11T04:24:39.660 回答