14

Sto lavorando con la nuova API di GoogleMaps (v2) e ho alcuni problemi con il frammento. Ho due frammenti nella mia app (Mappa, Elenco) e l'utente può passare da uno all'altro. Funziona bene finora con questo codice:Salvataggio dello stato di MapFragment (Maps v2) in Android

if (itemPosition == 0) { 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.fragmentpos, myMapFragment).commit(); 
    } else if (itemPosition == 1) { 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.fragmentpos, myListFragment).commit(); 
}...... 

Quando lavoro con la mappa, passare al frammento lista e poi di nuovo al frammento mappa, l'ultima posizione della mappa non è salvato. Questo non è quello che voglio, voglio che la mappa sia nello stato di salvataggio in quanto l'ho "lasciata" .. Come posso realizzare questo? Ho cercato di salvare la posizione della telecamera in

public void onSaveInstanceState(Bundle outState){ 
    outState.putDouble("LAT", mMap.getCameraPosition().target.latitude); 
    outState.putDouble("LON", mMap.getCameraPosition().target.longitude); 
    outState.putFloat("BEAR", mMap.getCameraPosition().bearing); 
    ... 

}

e ripristinarlo in onCreateView(), ma il fascio è sempre nullo. OnSaveInstanceState non viene chiamato se sostituisco i frammenti.

Quindi, come posso salvare lo stato della mappa?

+0

può si prega di dare un'occhiata alla mia domanda e fammi sapere dove mi trovo andando storto ... ecco la mia domanda - http://stackoverflow.com/questions/14124354/android-supportmapfragment-with-google-map-api-2-0-giving-error – Nik

risposta

16

Come posso realizzare questo?

Se replace() un frammento, una vista del vecchio frammento sia distrutto, che tira fuori il tuo MapView e, presumibilmente, il CameraPosition.

onSaveInstanceState() è principalmente per modifiche di configurazione, come rotazioni dello schermo. MapFragment e SupportMapFragment conservano già il numero CameraPosition (che, in BTW, è Parcelable, quindi è possibile salvare l'intero oggetto nel numero Bundle anziché in modo frammentario).

È possibile considerare l'utilizzo di show() e hide() anziché replace(), in modo che il frammento e le sue viste restino in ordine.

+0

Mi caccio nei guai usando show() e hide() con due mapfragments. Il primo mapfragment si carica correttamente e posso interagire con esso. Tuttavia quando cambio scheda, il secondo mapfragment mostra la stessa vista della mappa della prima e i suoi controlli non controllano la vista. Quando torno al primo mapfragment, i controlli riprendono a funzionare. Suppongo che il secondo mapfragment stia utilizzando la vista di superficie del primo per qualche motivo. Qualche indizio su come posso risolvere questo? – basilisk

+0

@basilisk: in cima alla mia testa, no. Scusate! – CommonsWare

+1

Grazie per la rapida risposta. Continuerò a farlo e riferirò se trovo qualcosa. – basilisk

0

Ho risolto questo problema mantenendo un riferimento allo CameraPosition sulla mappa nel metodo onDestroyView() del frammento; quindi usando quello CameraPosition quando si reinstatizza la mappa.

Il contesto della mia soluzione ha le sue peculiarità, ma essenzialmente ho un frammento di mappa annidato all'interno di un altro frammento (sul quale sono aggrappato, anche dopo che è stato sostituito). Quindi questo è il codice nel metodo del frammento genitore onActivityCreated():

GoogleMapOptions mapOptions = new GoogleMapOptions(); 
    if(_savedCameraPosition != null) 
    { 
     mapOptions.camera(_savedCameraPosition); 
    } 
    else 
    { 
     // Centre on Australia 
     mapOptions.camera(CameraPosition.fromLatLngZoom(new LatLng(-24.25, 133.25), 15)); 
    } 
    _mapFragment = new SupportMapFragment().newInstance(mapOptions); 

    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.map_holder, _mapFragment); 
    fragmentTransaction.commit(); 

Poi più tardi nella stessa classe ho:

@Override 
public void onDestroyView() 
{ 
    super.onDestroyView(); 
    _savedCameraPosition = _map.getCameraPosition(); 
} 
Problemi correlati