Сохранение MapFragment (Maps v2) Состояние на Android - программирование

Сохранение 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 не вызывается, если я заменяю фрагменты.

Итак, как я могу сохранить состояние карты?

4b9b3361

Ответ 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();
}