Сохранение MapFragment (Maps v2) Состояние на Android
Я работаю с новым API GoogleMaps (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 всегда имеет значение null. OnSaveInstanceState не вызывается, если я заменяю фрагменты.
Итак, как я могу сохранить состояние карты?
Ответы
Ответ 1
Как я могу это сделать?
Если вы replace()
фрагмент, фрагменты старого фрагмента уничтожаются, и вы получаете MapView
и, предположительно, CameraPosition
.
onSaveInstanceState()
в основном используется для изменения конфигурации, например, для вращения экрана. MapFragment
и SupportMapFragment
уже сохраняют CameraPosition
(что, BTW, Parcelable
, поэтому вы можете сохранить весь объект в Bundle
, а не по частям).
Вы можете использовать show()
и hide()
вместо replace()
, поэтому фрагмент и его представления будут зависеть.
Ответ 2
Я решил эту проблему, держа ссылку на 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();
}