Saving MapFragment (Maps v2) State in Android

夙愿已清 提交于 2019-12-19 12:37:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!