14

Ich arbeite mit der neuen GoogleMaps API (v2) und habe einige Probleme mit dem Fragment. Ich habe zwei Fragmente in meiner App (Karte, Liste) und der Benutzer kann zwischen ihnen wechseln. Adaequat bisher mit diesem Code:Saving MapFragment (Karten v2) State 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(); 
}...... 

Als ich mit der Karte arbeiten, wechseln Sie in der Liste Fragment und dann zurück auf die Karte Fragment, die letzte Position der Karte nicht gespeichert. Dies ist nicht das, was ich will, ich möchte, dass die Karte in den Status speichern ist, wie ich es "verließ". Wie kann ich das erreichen? Ich habe versucht, die Kameraposition 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); 
    ... 

}

und es wieder in onCreateView() zu retten, aber das Bundle ist immer null. Der onSaveInstanceState wird nicht aufgerufen, wenn ich die Fragmente ersetze.

Wie kann ich den Status der Karte speichern?

+0

können Sie bitte einen Blick auf meine Frage haben und lassen Sie mich wissen, wo ich bin schief geht .. hier ist meine Frage - http://stackoverflow.com/questions/14124354/android-supportmapfragment-with-google-map-api-2-0-giving-error – Nik

Antwort

16

Wie kann ich das erreichen?

Wenn Sie replace() ein Fragment, die Ansichten des alten Fragment zerstört werden, die Ihre nimmt MapView und vermutlich die CameraPosition.

onSaveInstanceState() ist vor allem für Konfigurationsänderungen wie Bildschirmrotationen. MapFragment und SupportMapFragment schon behalten Sie die CameraPosition (die, BTW, ist Parcelable, so dass Sie das ganze Objekt in der Bundle anstatt Stückchen speichern können).

Sie könnten show() und hide() anstelle von replace() verwenden, so dass das Fragment und seine Ansichten bleiben.

+0

Ich rate in Schwierigkeiten mit show() und hide() mit zwei Mapfragmenten. Das erste Mapfragment wird ordnungsgemäß geladen, und ich kann damit interagieren. Wenn ich jedoch die Registerkarte wechsle, zeigt das zweite Mapfragment die gleiche Map-Ansicht wie das erste und seine Steuerelemente steuern nicht die Ansicht. Wenn ich zum ersten Mapfragment zurückwechsle, beginnen die Steuerelemente wieder zu arbeiten. Ich gehe davon aus, dass das zweite Mapfragment aus irgendeinem Grund die Oberflächenansicht des ersten Maps verwendet. Irgendwelche Hinweise, wie kann ich das lösen? – basilisk

+0

@basilisk: Von meinem Kopf, nein. Es tut uns leid! – CommonsWare

+1

Danke für die schnelle Antwort. Ich bleibe dran und melde mich, wenn ich etwas finde. – basilisk

0

Ich löste dieses Problem durch Festhalten an eine Referenz auf die CameraPosition auf der Karte in der onDestroyView() Methode des Fragments; Verwenden Sie dann das CameraPosition bei der erneuten Zuordnung der Karte.

Der Kontext meiner Lösung hat seine eigenen Macken, aber im Wesentlichen habe ich ein Kartenfragment in einem anderen Fragment verschachtelt (an dem ich mich festhalte, auch nachdem es ersetzt wurde). So dies der Code in der onActivityCreated() Methode des Elternfragment ist:

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

dann später in der gleichen Klasse habe ich:

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