问题
I'm working with the new GoogleMaps API (v2) and have some problems with the fragment. I have two fragments in my app (Map, List) and the user can switch between them. Works fine so far with this code:
if (itemPosition == 0) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentpos, myMapFragment).commit();
} else if (itemPosition == 1) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentpos, myListFragment).commit();
}......
When I work with the map, switch to the list fragment and then back to the map fragment, the last position of the map is not saved. This is not what i want, i want that the map is in the save state as i "left" it.. How can I accomplish this? I tried to save the camera position in
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);
...
}
and restore it in onCreateView(), but the Bundle is always null. The onSaveInstanceState is not called if I replace the fragments.
So how can I save the state of the map?
回答1:
How can I accomplish this?
If you replace()
a fragment, the old fragment's views are destroyed, which takes out your MapView
and, presumably, the CameraPosition
.
onSaveInstanceState()
is mostly for configuration changes, such as screen rotations. MapFragment
and SupportMapFragment
already retain the CameraPosition
(which, BTW, is Parcelable
, so you can save the whole object in the Bundle
rather than piecemeal).
You could consider using show()
and hide()
instead of replace()
, so the fragment and its views sticks around.
回答2:
I solved this problem by holding on to a reference to the CameraPosition
on the map in the onDestroyView()
method of the fragment; then using that CameraPosition
when reinstatiating the map.
The context of my solution has it's own quirks, but essentially I have a map fragment nested within another fragment (which I'm hanging on to, even after it get's replaced). So this is the code in the parent fragment's onActivityCreated()
method:
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();
Then later in the same class I have:
@Override
public void onDestroyView()
{
super.onDestroyView();
_savedCameraPosition = _map.getCameraPosition();
}
来源:https://stackoverflow.com/questions/14114383/saving-mapfragment-maps-v2-state-in-android