7

我正在使用 Google Maps Android API v2 构建一个非常简单的地图应用程序。正如预期的那样,当用户离开然后返回应用程序时,他们在位置、缩放等方面所做的任何更改都会丢失,因为活动会被销毁并重新创建。

我知道我可以以编程方式保存地图的相机状态(可能作为共享首选项中的值)onPause()并将其恢复到 中onResume(),但是 API 是否有任何内置机制可以在活动启动之间保持地图状态?

4

4 回答 4

9

我不认为你可以,但你可以保存你CameraPosition的位置/缩放/角度...

http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

所以你可以在你的函数中编写一个函数,从你的地图onDestroy中获取CameraPosition并将其存储在你的SharedPreferences. 在您中onCreate(),您CameraPositionSharedPreferences(在您的地图实例化之后)重新创建您的。

// 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-05-22T18:00:00.650 回答
1

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));
}
于 2020-03-15T15:08:13.483 回答
1

按照此处的说明Retain instance of MapFragment,您可以简单地调用setRetainInstance(true);orMapFragment以便SupportMapFragment在设备方向更改后保留相机状态和标记。但是,SharedPreferences如果您想保持longilong提到的应用程序启动之间的状态,这是要走的路

于 2018-08-03T14:01:55.450 回答
0

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.

于 2013-05-22T20:45:30.530 回答