在Android中保存MapFragment(Maps v2)状态

时间:2013-01-01 21:28:02

标签: android android-fragments android-maps android-fragmentactivity

我正在使用新的GoogleMaps API(v2)并且该片段存在一些问题。我的应用程序(Map,List)中有两个片段,用户可以在它们之间切换。到目前为止使用此代码正常工作:

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()中恢复它,但Bundle始终为null。如果我替换片段,则不会调用onSaveInstanceState。

那么如何保存地图的状态?

2 个答案:

答案 0 :(得分:17)

  

我该如何做到这一点?

如果你replace()一个片段,旧片段的视图会被销毁,这会取消你的MapView,大概是CameraPosition

onSaveInstanceState()主要用于配置更改,例如屏幕旋转。 MapFragmentSupportMapFragment已保留CameraPosition(BTW,Parcelable,因此您可以将整个对象保存在Bundle而不是零碎的中。

您可以考虑使用show()hide()代替replace(),因此片段及其视图会一直存在。

答案 1 :(得分: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();
}