Je construis une application de carte très simple à l'aide de Google Maps Android API V2. Comme prévu, lorsque l'utilisateur part puis revient à l'application, toutes les modifications apportées à l'emplacement, à zoomer, etc. sont perdues lorsque l'activité est détruite et recréée. P>
Je sais que je peux enregistrer l'état de la caméra de la carte par programme (peut-être comme des valeurs dans des préférences partagées) dans onpaause () code> et le restaurer dans
tinrésume () code>, mais le code API dispose d'un mécanisme intégré pour persister l'état de la carte entre les lancements d'activité? P>
4 Réponses :
Je ne pense pas que vous puissiez, mais vous pouvez enregistrer votre http://developer.android.com/reference/com/google/android/gms/maps/model /Cameraposition.html p> Vous pouvez donc écrire une fonction dans votre caméraposition code> qui a votre position / zoom / angle ...
Ondestroy code> qui obtient la caméraposition code> de votre carte et stockez-la dans votre carte
SharedPreferences Code>. Dans votre
Oncreate () CODE> Vous recréez votre
cameraposition code> à partir du
SharedPreferences code> (Une fois que votre carte est instanciée). P>
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
Enregistrement de la caméraposition code> en tant qu'objet contralcier pendant OnsaveInstancestate () Code> semblerait fonctionner pour un changement d'orientation, quand on l'appelle, mais ce n'est pas appelé lorsque l'utilisateur sort de toucher le bouton arrière. Je reçois
Onpaause () Code>,
Onstop () Code>,
OnDestroy () Code> - Aucun qui me donne accès à l'ensemble de l'état d'instance. J'apprends juste à propos de la direction de l'État, alors pardonnez-moi si je me trompe.
Est-ce que je manque quelque chose? Il n'y a aucune garantie que OnDestroy sera appelé, il est donc préférable de sauvegarder les données de la méthode de l'onpause. De même, il est une bonne pratique pour récupérer les données d'ONRESUME plutôt que dans Oncreate.
À côté de vous OnDestroy code> -Eron't-être appelé objection, cela ne fera aucune différence. Nous avons utilisé Oncreate / Ondestroy parce que nous voulions seulement recréer MapState lors du démarrage de l'application. Cependant, déplacer les blocs sur
Onresume code> et
OnaAUSe code> fonctionnera aussi
Il n'y a rien dans l'API pour ce cas d'utilisation. P>
Vous voudrez peut-être essayer cette bibliothèque: https://github.com/fsilvestremorais/androïd- Complex-préférences P>
Il ne sera pas aussi efficace que d'écrire un tas de Quoi qu'il en soit, vous pouvez également poster une demande de fonctionnalité sur GMAPS-API-Problèmes (ou Extensions de cartes Android ). C'est certainement quelque chose qui manque à persister d'objets simples ( SharedPreferences.editor.put ... code> pour les valeurs à partir de
caméraposition code> dans
OnaAUSe code> , parce qu'il utilise GSON en interne, mais enregistre un certain temps si vous avez un objet plus complexe pour enregistrer et restaurer. p>
caméraposition code>,
letlng code>,
lettlngbounds code>) facilement. P>
Comme alternative: je maintiens le Bibliothèque TypedPreferences .
@JJD Hey Tobias, je l'ai déjà vu auparavant, mais votre lib n'a pas ObjectPreference code> (plus?). Quoi qu'il en soit, je suggérerais maintenant d'utiliser Hrisey et @ Préférences annotation à la place. L'AS tu vu?
Non, TypedPreferences i> ne prend en charge que les "primitives". Je ne savais pas hrisey i> - merci de partage. J'y jetterais un œil.
Comme indiqué ici Conserver l'instance de MapFraGment A>, vous pouvez simplement appeler setretataininstance (true); code> pour un
ou
ou
supportmapfragment code> afin de conserver l'état de la caméra et des marqueurs après une orientation de l'appareil monnaie. Toutefois,
SharedPreferences Code> est la voie à suivre si vous souhaitez conserver l'état entre les lancements d'applications mentionnés par Longilong p>
Tous les crédits vont à Longi pour la réponse en 2013. Cela m'a beaucoup aidé. Afin d'aider les autres encore plus laissez-moi partager ma solution exacte (basée sur la réponse de Longi).
Enregistrer la position de la caméra dans Onstop (): P>
@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)); }