所以我有以下正常工作的事情:
我有一张地图片段,我的地图上有标记。在我的地图片段上使用.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);
}
}
答案 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...
}