2013-05-22 4 views
4

Я создаю очень простое приложение карты с помощью Google Maps Android API v2. Как и ожидалось, когда пользователь уходит, а затем возвращается в приложение, любые изменения, которые они сделали в местоположении, масштабировании и т. Д., Теряются по мере уничтожения и повторного создания активности.Google Maps Android API v2 - восстановление состояния карты

Я знаю, что я могу сохранить состояние камеры изображения карты программно (возможно, в виде значений в общих настройках) в onPause() и восстановить его в onResume(), но делает API имеет какой-либо встроенный механизм для сохраняющегося состояния карты между запусками деятельности?

ответ

9

Я не думаю, что вы можете, но вы можете сохранить ваши CameraPosition, который имеет вашу позицию/Zoom/угол ...

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)); 
+3

Сохранение 'CameraPosition' в качестве объекта parcelable во время' onSaveInstanceState() ', похоже, будет работать для изменения ориентации, когда оно вызывается, но оно не вызывается, когда пользователь выходит, касаясь кнопки« Назад ». Там я получаю 'onPause()', 'onStop()', 'onDestroy()' - ни один из которых не дает мне доступ к Bundle состояния экземпляра. Я просто узнаю о государственном управлении, поэтому простите меня, если я ошибаюсь. –

+0

Я что-то упустил? нет гарантии, что onDestroy будет вызван, поэтому лучше сохранить данные в методе onPause. Точно так же хорошей практикой является получение данных в onResume, а не в onCreate. –

+0

рядом с вами 'onDestroy'-won't-be-called-возражение, это не будет иметь никакого значения. Мы использовали onCreate/onDestroy, потому что мы только хотели воссоздать mapstate при запуске приложения. Однако перемещение блоков в 'onResume' и' onPause' будет работать тоже – longilong

0

В этом случае нет ничего в API.

Вы можете попробовать эту библиотеку: https://github.com/fsilvestremorais/android-complex-preferences

Это не будет столь же эффективным, как просто писать кучу SharedPreferences.Editor.put... для значений из CameraPosition в , потому что он использует Gson внутренне, но экономит время, если у вас есть более сложный объект для сохранения и восстановления.

В любом случае вы также можете отправить запрос функции на gmaps-api-issues (или Android Maps Extensions). Это, безусловно, что-то, что отсутствует, чтобы сохранить простые объекты (CameraPosition, LatLng, LatLngBounds) легко.

+0

. В качестве альтернативы: я поддерживаю библиотеку [TypedPreferences] (https://github.com/johnjohndoe/TypedPreferences). – JJD

+1

@JJD Эй, Тобиас, я видел это раньше, но у вашей библиотеки нет «ObjectPreference» (больше?). В любом случае, теперь я предлагаю использовать аннотацию [Hrisey] (https://github.com/mg6maciej/hrisey) и [@Preferences] (https://github.com/mg6maciej/hrisey/wiki/Preferences). Вы видели это? –

+0

Нет, * TypedPreferences * поддерживает только «примитивы». Я не знал * Hrisey * - спасибо за обмен.Я посмотрю. – JJD

Смежные вопросы