18

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

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 始终为空。如果我替换片段,则不会调用 onSaveInstanceState。

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

4

2 回答 2

17

我怎样才能做到这一点?

如果您replace()是一个片段,则旧片段的视图将被破坏,从而取出您的MapView,大概是CameraPosition.

onSaveInstanceState()主要用于配置更改,例如屏幕旋转。MapFragment并且SupportMapFragment已经保留了CameraPosition(顺便说一句,它是Parcelable,因此您可以将整个对象保存在Bundle而不是零碎中)。

您可以考虑使用show()andhide()而不是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 回答