问题是mMap
当你恢复时你是null,然后你不能使用mMap.moveCamera();
,例如,这会导致你的应用程序崩溃.
解决方法是在尝试再次使用之前检查是否需要设置地图.
我稍微修改了你的代码,以检查是否需要在onCreate和onResume中设置地图.请注意,我使用onPause而不是onStop,因为它与onResume相对应.
private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); setupMapIfNeeded(); } private void setupMapIfNeeded() { // Obtain the SupportMapFragment and get notified when the map is ready to be used. if (mMap == null) { SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; MapStateManager mgr = new MapStateManager(this); CameraPosition position = mgr.getSavedCameraPosition(); if (position != null) { CameraUpdate update = CameraUpdateFactory.newCameraPosition(position); Toast.makeText(this, "entering Resume State", Toast.LENGTH_SHORT).show(); mMap.moveCamera(update); mMap.setMapType(mgr.getSavedMapType()); } } @Override protected void onPause() { super.onPause(); MapStateManager mgr = new MapStateManager(this); mgr.saveMapState(mMap); Toast.makeText(this, "Map State has been save?", Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { super.onResume(); setupMapIfNeeded(); }
MapstateManager完全一样.
public class MapStateManager { private static final String LONGITUDE = "longitude"; private static final String LATITUDE = "latitude"; private static final String ZOOM = "zoom"; private static final String BEARING = "bearing"; private static final String TILT = "tilt"; private static final String MAPTYPE = "MAPTYPE"; private static final String PREFS_NAME ="mapCameraState"; private SharedPreferences mapStatePrefs; public MapStateManager(Context context) { mapStatePrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } public void saveMapState(GoogleMap mapMie) { SharedPreferences.Editor editor = mapStatePrefs.edit(); CameraPosition position = mapMie.getCameraPosition(); editor.putFloat(LATITUDE, (float) position.target.latitude); editor.putFloat(LONGITUDE, (float) position.target.longitude); editor.putFloat(ZOOM, position.zoom); editor.putFloat(TILT, position.tilt); editor.putFloat(BEARING, position.bearing); editor.putInt(MAPTYPE, mapMie.getMapType()); editor.commit(); } public CameraPosition getSavedCameraPosition() { double latitude = mapStatePrefs.getFloat(LATITUDE, 0); if (latitude == 0) { return null; } double longitude = mapStatePrefs.getFloat(LONGITUDE, 0); LatLng target = new LatLng(latitude, longitude); float zoom = mapStatePrefs.getFloat(ZOOM, 0); float bearing = mapStatePrefs.getFloat(BEARING, 0); float tilt = mapStatePrefs.getFloat(TILT, 0); CameraPosition position = new CameraPosition(target, zoom, tilt, bearing); return position; } public int getSavedMapType() { return mapStatePrefs.getInt(MAPTYPE, GoogleMap.MAP_TYPE_NORMAL); } }