18

新しいGoogleMapsAPI(v2)を使用していますが、フラグメントに問題があります。アプリに2つのフラグメント(マップ、リスト)があり、ユーザーはそれらを切り替えることができます。これまでのところ、このコードで正常に動作します。

if (itemPosition == 0) {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragmentpos, myMapFragment).commit();
    } else if (itemPosition == 1) {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragmentpos, myListFragment).commit();
}......

マップを操作し、リストフラグメントに切り替えてからマップフラグメントに戻ると、マップの最後の位置が保存されません。これは私が望んでいることではありません。マップを「残した」ときにマップを保存状態にしておく必要があります。これを実現するにはどうすればよいですか。カメラの位置を保存しようとしました

public void onSaveInstanceState(Bundle outState){
   outState.putDouble("LAT", mMap.getCameraPosition().target.latitude);
   outState.putDouble("LON", mMap.getCameraPosition().target.longitude);
   outState.putFloat("BEAR", mMap.getCameraPosition().bearing);
   ...

}

onCreateView()で復元しますが、バンドルは常にnullです。フラグメントを置き換えると、onSaveInstanceStateが呼び出されません。

では、どうすればマップの状態を保存できますか?

4

2 に答える 2

17

どうすればこれを達成できますか?

フラグメントの場合replace()、古いフラグメントのビューが破棄され、あなたMapViewと、おそらくはが削除されますCameraPosition

onSaveInstanceState()主に画面の回転などの構成変更用です。MapFragmentそして、SupportMapFragmentすでに保持していますCameraPosition(ところで、これはですので、オブジェクト全体を断片的ではなくParcelable保存できます)。Bundle

の代わりにshow()とを使用することを検討できます。そのため、フラグメントとそのビューが残ります。hide()replace()

于 2013-01-01T21:35:05.647 に答える
0

フラグメントCameraPositionのメソッドでマップ上のへの参照を保持することで、この問題を解決しました。onDestroyView()次にCameraPosition、マップを復元するときにそれを使用します。

私のソリューションのコンテキストには独自の癖がありますが、基本的には別のフラグメント内にネストされたマップフラグメントがあります(置き換えられた後でも、これを使用しています)。したがって、これは親フラグメントのonActivityCreated()メソッドのコードです。

    GoogleMapOptions mapOptions = new GoogleMapOptions();
    if(_savedCameraPosition != null)
    {
        mapOptions.camera(_savedCameraPosition);
    }
    else
    {
        // Centre on Australia
        mapOptions.camera(CameraPosition.fromLatLngZoom(new LatLng(-24.25, 133.25), 15));
    }
    _mapFragment = new SupportMapFragment().newInstance(mapOptions);

    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.map_holder, _mapFragment);
    fragmentTransaction.commit();

その後、同じクラスで私は持っています:

@Override
public void onDestroyView()
{
    super.onDestroyView();
    _savedCameraPosition = _map.getCameraPosition();
}
于 2013-02-21T09:07:58.783 に答える