在安卓中保存地图碎片(Google Maps v2)状态

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。

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


你能否请看一下我的问题并告诉我哪里出了问题...这是我的问题链接 - https://dev59.com/Huo6XIcBkEYKwwoYOR0q - Nik
2个回答

17
如果使用replace()替换一个Fragment,则旧的Fragment视图将被销毁,这会带走MapViewCameraPositiononSaveInstanceState()主要用于配置更改,例如屏幕旋转。 MapFragmentSupportMapFragment 已保留了CameraPosition(顺便说一下,它是Parcelable,因此可以将整个对象保存在Bundle中而不是逐个保存)。
您可以考虑使用show()hide()来替代replace(),以便Fragment及其视图保留下来。

@basilisk:就我所知,没有。抱歉! - CommonsWare
1
谢谢你的快速回复。我会继续努力,并且如果有发现什么问题的话会及时报告的。 - Anuj
我确定的是它是视图,因为第二个片段上的缩放控件按照预期的方式激活和停用(缩小按钮开始停用,并在我点击放大按钮后激活,再次在我点击缩小按钮时停用)。 - Anuj
在我的应用程序中,我遇到了相同的问题。当我使用show()和hide()时,它可以正常工作,但是当我杀死应用程序时,我的应用程序会受到阻塞或挂起,此时只能通过返回或使用ActionBar控件,因为地图控件无法正常工作... PS:我使用MapFragment + ListFragment。 - cesards
http://stackoverflow.com/questions/15116536/mapfragment-blocked-or-stunned-when-application-is-killed-or-state-saved - cesards
显示剩余2条评论

0

我通过在片段的onDestroyView()方法中保留地图上CameraPosition的引用来解决了这个问题;然后在重新实例化地图时使用该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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接