【问题标题】:Saving MapFragment (Maps v2) State in Android在 Android 中保存 MapFragment (Maps v2) 状态
【发布时间】:2012-12-16 08:49:21
【问题描述】:

我正在使用新的 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。

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

【问题讨论】:

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


【解决方案1】:

我怎样才能做到这一点?

如果你 replace() 一个片段,旧片段的视图将被销毁,这会删除你的 MapView 和大概的 CameraPosition

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

您可以考虑使用show()hide() 而不是replace(),这样片段及其视图就会保留。

【讨论】:

  • 我在使用带有两个 mapfragments 的 show() 和 hide() 时遇到了麻烦。第一个地图片段正确加载,我可以与之交互。但是,当我切换选项卡时,第二个 mapfragment 显示与第一个相同的地图视图,并且它的控件不控制视图。当我切换回第一个 mapfragment 时,控件再次开始工作。我假设第二个 mapfragment 出于某种原因正在使用第一个的表面视图。关于如何解决这个问题的任何线索?
  • @basilisk:在我的脑海中,不。对不起!
  • 感谢您的快速回复。如果我发现任何东西,我会继续努力并报告。
  • 我确定的是它的视图,因为第二个片段上的缩放控件按预期方式激活和停用(缩小按钮开始停用,并在我单击放大后激活按钮,并在我单击缩小按钮时再次停用)。
  • 在使用多个地图片段时,我一直遇到地图片段无法正确显示和隐藏的问题。如果我找到解决该问题的方法,我会发布,但也许应该在另一个问题中关注这个问题。
【解决方案2】:

我通过在片段的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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多