7
votes

Google Maps Android API V2 - Restauration de la carte

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.

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 () et le restaurer dans tinrésume () , mais le code API dispose d'un mécanisme intégré pour persister l'état de la carte entre les lancements d'activité?


0 commentaires

4 Réponses :


9
votes

Je ne pense pas que vous puissiez, mais vous pouvez enregistrer votre caméraposition code> qui a votre position / zoom / angle ...

http://developer.android.com/reference/com/google/android/gms/maps/model /Cameraposition.html p>

Vous pouvez donc écrire une fonction dans votre 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));


3 commentaires

Enregistrement de la caméraposition en tant qu'objet contralcier pendant OnsaveInstancestate () 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 () , Onstop () , OnDestroy () - 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 -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 et OnaAUSe fonctionnera aussi



0
votes

Il n'y a rien dans l'API pour ce cas d'utilisation.

Vous voudrez peut-être essayer cette bibliothèque: https://github.com/fsilvestremorais/androïd- Complex-préférences

Il ne sera pas aussi efficace que d'écrire un tas de SharedPreferences.editor.put ... pour les valeurs à partir de caméraposition dans OnaAUSe , parce qu'il utilise GSON en interne, mais enregistre un certain temps si vous avez un objet plus complexe pour enregistrer et restaurer.

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 ( caméraposition , letlng , lettlngbounds ) facilement.


3 commentaires

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 (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 ne prend en charge que les "primitives". Je ne savais pas hrisey - merci de partage. J'y jetterais un œil.




1
votes

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));
}


0 commentaires