【问题标题】:What is recommended way to use Google Map v2 inside fragment?在片段中使用 Google Map v2 的推荐方法是什么?
【发布时间】:2013-03-05 14:16:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android android-mapview android-maps android-maps-v2


    【解决方案1】:

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

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

    来自Android Developer Site

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

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

    【讨论】:

    • 谢谢,我刚刚测试了你的代码。如果我在 executePendingTransaction 之后立即进行 getMap() 调用,它将仍然为空。
    • 我发现这也可能与您的问题有关:stackoverflow.com/questions/13722192/…
    【解决方案2】:

    您可以在 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。

    唯一的区别(似乎是谷歌地图的一个错误?)是你还需要手动初始化谷歌地图:

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

    【讨论】:

    • 我对这种方法有疑问。当我尝试转发 onCreate 时,地图会不时崩溃。 code.google.com/p/gmaps-api-issues/issues/…
    • 嗯,我在我的最新项目中使用 MapView(在片段内)并没有收到此错误。这个问题可能与嵌套片段有关吗?尝试使用 null 作为 savedInstanceState 参数调用 onCreate 方法(尽管我知道这不是一个好的解决方案)。
    • MCeley,如果不使用片段,我应该手动调用 mapView.onCreate。
    • Alexey - 你可以在这里找到 BadParcelableException 的解决方案:stackoverflow.com/a/16348984/881107
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2013-07-18
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多