我正在使用 Google Maps Android API v2 构建一个非常简单的地图应用程序。正如预期的那样,当用户离开然后返回应用程序时,他们在位置、缩放等方面所做的任何更改都会丢失,因为活动会被销毁并重新创建。
我知道我可以以编程方式保存地图的相机状态(可能作为共享首选项中的值)onPause()
并将其恢复到 中onResume()
,但是 API 是否有任何内置机制可以在活动启动之间保持地图状态?
我不认为你可以,但你可以保存你CameraPosition
的位置/缩放/角度...
http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html
所以你可以在你的函数中编写一个函数,从你的地图onDestroy
中获取CameraPosition
并将其存储在你的SharedPreferences
. 在您中onCreate()
,您CameraPosition
从SharedPreferences
(在您的地图实例化之后)重新创建您的。
// somewhere in your onDestroy()
@Override
protected void onDestroy() {
CameraPosition mMyCam = MyMap.getCameraPosition();
double longitude = mMyCam.target.longitude;
(...)
SharedPreferences settings = getSharedPreferences("SOME_NAME", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putDouble("longitude", longitude);
(...) //put all other values like latitude, angle, zoom...
editor.commit();
}
在你的onCreate()
SharedPreferences settings = getSharedPreferences("SOME_NAME", 0);
// "initial longitude" is only used on first startup
double longitude = settings.getDouble("longitude", "initial_longitude");
(...) //add the other values
LatLng startPosition = new LatLng() //with longitude and latitude
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(startPosition) // Sets the center of the map to Mountain View
.zoom(17) // Sets the zoom
.bearing(90) // Sets the orientation of the camera to east
.tilt(30) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
创建一个新的 cameraPosition 并为其设置动画。可以肯定的是,地图在那个时候被实例化了
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
2013 年的答案全部归功于 longi。它对我帮助很大。为了更多地帮助其他人,让我分享我的确切解决方案(基于longi的回答)。
在 onStop() 中保存相机位置:
@Override
protected void onStop() {
super.onStop();
CameraPosition mMyCam = mMap.getCameraPosition();
double longitude = mMyCam.target.longitude;
double latitude = mMyCam.target.latitude;
float zoom = mMyCam.zoom;
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putFloat("longitude", (float)longitude);
editor.putFloat("latitude", (float)latitude);
editor.putFloat("zoom", zoom);
editor.apply();
}
在 onMapReady() 中获取相机位置:
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Get previous (or default) camera position
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
double longitude = sharedPref.getFloat("longitude", DEFAULT_LONGITUDE);
double latitude = sharedPref.getFloat("latitude", DEFAULT_LATITUDE);
float zoom = sharedPref.getFloat("zoom", DEFAULT_ZOOM);
LatLng startPosition = new LatLng(latitude, longitude);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(startPosition)
.zoom(zoom)
.build();
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
按照此处的说明Retain instance of MapFragment,您可以简单地调用setRetainInstance(true);
orMapFragment
以便SupportMapFragment
在设备方向更改后保留相机状态和标记。但是,SharedPreferences
如果您想保持longilong提到的应用程序启动之间的状态,这是要走的路
There is nothing in the API for this use case.
You may want to try this library: https://github.com/fsilvestremorais/android-complex-preferences
It will not be as efficient as just writing a bunch of SharedPreferences.Editor.put...
for values from CameraPosition
in onPause
, because it uses Gson internally, but saves some time if you have a more complex object to save and restore.
Anyway you may also post a feature request on gmaps-api-issues (or Android Maps Extensions). It's certainly something that is missing to persist simple objects (CameraPosition
, LatLng
, LatLngBounds
) easily.