使用.setRetainInstance

时间:2016-04-21 17:00:45

标签: android google-maps android-fragments

所以我有以下正常工作的事情:

我有一张地图片段,我的地图上有标记。在我的地图片段上使用.setRetainInstance完全符合我的要求,在旋转时它会保持用户缩放的位置并将标记保留在它们的位置上。我现在唯一想做的就是制作应用程序的初始屏幕,将相机移动到一个确切的位置和缩放级别。我正在使用initialLocation方法,如果在onMapReady中添加了它应该执行的操作。问题是,一旦我在onMapReady中添加此方法,setRetainInstance就不再起作用,在每次旋转时,地图都会重置为initialLocation位置。正如你可能从我的代码中意识到的那样,我只是在学习这个,并且我已经阅读了很多教程,但我无法做到这一点。这是代码的一部分,所以你可以知道我在说什么。我想我必须添加某种条件才能使其正常工作。任何建议将不胜感激。

private static final double
        TOULOUSE_LAT = 43.604346,
        TOULOUSE_LNG = 1.443760;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if (savedInstanceState == null){
            mapTypeSelected = GoogleMap.MAP_TYPE_NORMAL;
            mapFragment.setRetainInstance(true);

        } else {
            mapTypeSelected = savedInstanceState.getInt("the_map_type", GoogleMap.MAP_TYPE_NORMAL);
        }

  @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        initialLocation(TOULOUSE_LAT,TOULOUSE_LNG, 12);
        mMap.setMapType(mapTypeSelected);


        addMarkers2Map();// method for adding markers and a lot of other stuff...

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("the_map_type", mapTypeSelected);



    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.get("the_map_type");

    }

    private void initialLocation(double lat, double lng, float zoom){
        LatLng latLng = new LatLng(lat, lng );
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom);
        mMap.moveCamera(update);
    }
}

1 个答案:

答案 0 :(得分:1)

尝试添加与此类似的成员变量:

Boolean mSetCameraPosition;

然后在onCreate()中设置mSetCameraPosition的值,然后再调用getMapAsync()

if (savedInstanceState == null) {
    mapTypeSelected = GoogleMap.MAP_TYPE_NORMAL;
    mapFragment.setRetainInstance(true);
    mSetCameraPosition = true;
}
else {
    mapTypeSelected = savedInstanceState.getInt("the_map_type", GoogleMap.MAP_TYPE_NORMAL);
    mSetCameraPosition = false;
}
mapFragment.getMapAsync(this);

onMapReady()中使用mSetCameraPosition

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    if (mSetCameraPosition) {
        initialLocation(TOULOUSE_LAT,TOULOUSE_LNG, 12);
    }

    mMap.setMapType(mapTypeSelected);

    addMarkers2Map(); // method for adding markers and a lot of other stuff...
}