28

マップが 2 番目の位置にあるドロップ ダウン ナビゲーションのあるアクティビティで Google Maps API V2 を使用しています。

次のように実用的にマップを追加しています。

mMapFragment = supportMapFragment.newInstance();
getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.placeHolder, mMapFragment, TAG_MAP)
        .commit(); 

ドキュメンテーションhttps://developers.google.com/maps/documentation/android/mapは で行うべきだと言ってmMapFragment.getMap()いますが、null を返します。

http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.htmlによると 、フラグメントが onCreateView ライフサイクル イベントを通過していない場合は null を返します。

フラグメントの準備ができていることを知るにはどうすればよいですか?

編集: これを見つけました。SupportMapFragment を使用するときにマップが使用できる状態であることを確認するにはどうすればよいですか?

onActivityCreated をオーバーライドすることは解決策のように思えますが、newInstance() ではなく、コンストラクターを使用してフラグメントをインスタンス化する必要があります。違いはありますか?

4

4 に答える 4

47

私の好みの方法は、コールバックを使用してからシグナルを取得することFragmentです。また、これは、Androidがアクティビティとのコミュニケーションで提案した推奨方法です。

たとえば、Fragmentのに、インターフェイスを追加して登録します。

public static interface OnCompleteListener {
    public abstract void onComplete();
}

private OnCompleteListener mListener;

public void onAttach(Context context) {
    super.onAttach(context);
    try {
        this.mListener = (OnCompleteListener)context;
    }
    catch (final ClassCastException e) {
        throw new ClassCastException(context.toString() + " must implement OnCompleteListener");
    }
}

次に、このインターフェイスActivity

public class MyActivity extends FragmentActivity implements MyFragment.OnCompleteListener {
    //...

    public void onComplete() {
        // After the fragment completes, it calls this callback.
        // setup the rest of your layout now
        mMapFragment.getMap()
    }
}

Fragmentさて、あなたの中にそれがロードされたことを意味するものは何でも、Activityそれが準備ができていることをあなたに通知してください。

@Override
protected void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // create your fragment
    //...

    // signal that you're done and tell the Actvity to call getMap()
    mListener.onComplete();
}

編集2017-12-05onAttach(アクティビティアクティビティ)は非推奨です。代わりにonAttach(コンテキストコンテキスト)を使用してください。上記のコードを調整しました。

于 2013-02-21T16:42:18.303 に答える
0

あなたの問題を完全に理解しているかどうかはわかりませんが、ナビゲーション ドロップダウン メニューを使用している同様の設定があります。これが私にとってうまくいくものです:

1.) xml ファイルからフラグメントをロードし、setupMapIfNeeded() を呼び出します。

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.basicMap);

setUpMapIfNeeded();

参照用のxmlファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/basicMap"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment" />

2.) 次に、マップをセットアップします (isGoogleMapsInstalled() の詳細については、この質問を参照してください) 。

    private void setUpMapIfNeeded() 
    {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) 
    {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap();
        // Check if we were successful in obtaining the map.
        if(isGoogleMapsInstalled())
        {
            if (mMap != null) 
            {
                mMap.setOnCameraChangeListener(getCameraChangeListener());
                mMap.setInfoWindowAdapter(new MyCustomInfoWindowAdapter(this));
            }
        }
        else
        {
            MapConstants.showDialogWithTextAndButton(this, R.string.installGoogleMaps, R.string.install, false, getGoogleMapsListener());
        }
    }
    }

3.) onResume() から setUpMapIfNeeded() も呼び出すようにしてください。

public void onResume()
{
    super.onResume();

    setUpMapIfNeeded();
}
于 2013-02-21T16:25:38.163 に答える