我正在使用新的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。
那么如何保存地图的状态?
答案 0 :(得分:17)
我该如何做到这一点?
如果你replace()
一个片段,旧片段的视图会被销毁,这会取消你的MapView
,大概是CameraPosition
。
onSaveInstanceState()
主要用于配置更改,例如屏幕旋转。 MapFragment
和SupportMapFragment
已保留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();
}