17

カスタム レイアウトでフラグメント内にマップを追加したい。

  1. SupportMapFragment を追加する ChildFragmentManager を使用して実行できます。このアプローチは現在使用しています。ただし、子フラグメント トランザクションは非同期であり、getMap が null を返さないことを保証するのが難しいため、欠点があります。
  2. もう 1 つの方法は、super から SupportMapFragment ストアの mapView を拡張することです。onCreateView

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

    膨らませたレイアウトに挿入します。主な問題は、フラグメントが保存された状態から復元しようとすると、Google Maps SDK が内部的にクラッシュすることです。

この問題を解決する他の方法はありますか。サンプルにこのようなものを含めていないため、Google マップ チームの誰かが正しいアプローチを推奨してくれれば幸いです。

4

2 に答える 2

13

すべてFragmentTransactionの は非同期です。トランザクションをすぐに実行したい場合は、次のように強制する必要があります。

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

Android デベロッパー サイトから:

FragmentTransactionが でコミットされた後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>

また、onCreate、onResume などの Fragment のライフサイクル メソッドを 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;
            }
        }
    }
}
于 2013-03-11T04:24:39.660 に答える