6

Ich versuche, eine Karte von einem SupportMapFragment zu erhalten, aber es gibt null zurück. Von was ich gelesen habe, könnte das sein, weil das Fragment noch nicht vollständig angezeigt wird und daher keine Karte existiert ?! Ich habe versucht, es mit executePendingTransactions() zu beheben, aber bisher ohne Erfolg.mapFragment.getMap() gibt null zurück

Irgendwelche Ideen, wie man es repariert? Hier

ist der Code

private GoogleMap map; 
private SupportMapFragment mapFragment; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    //... 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen_mission2); 
    GoogleMapOptions mapOptions = new GoogleMapOptions(); 

    mapOptions.mapType(GoogleMap.MAP_TYPE_NORMAL) 
     .compassEnabled(true) 
     .rotateGesturesEnabled(false) 
     .tiltGesturesEnabled(false); 

    android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager(); 
    android.support.v4.app.FragmentManager.enableDebugLogging(true); 
    mapFragment = SupportMapFragment.newInstance(mapOptions); 
    FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.mapFragment, mapFragment); 
    fragmentTransaction.commit(); 
    myFragmentManager.executePendingTransactions(); 

    if(mapFragment == null) Base.log("mapFragment==null"); 
    if(map==null){ 
     map = mapFragment.getMap(); 
     Base.log("map should have been initialized"); 
     if(map==null) Base.log("map still null"); 
    } 
} 

Und die Layout-Datei:

<fragment 
    android:id="@+id/mapFragment" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Es gibt folgende Protokoll

V/FragmentManager(24224): add: SupportMapFragment{4078c4b8 id=0x7f06003d} 
V/FragmentManager(24224): Allocated fragment index SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
V/FragmentManager(24224): moveto CREATED: SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
D/EMR  (24224): map should have been initialized 
D/EMR  (24224): map still null 
+0

angegeben haben hier erklärt Sie die 'mapFragment' Variable? – yugidroid

+0

Ja das habe ich deklariert (bearbeitet den Codeteil, siehe oben) – cos4

+0

Ist es initialisiert? Sonst ist es dasselbe wie nichts, d. H. "Null". – yugidroid

Antwort

1

Von dem, was ich lese dies sein könnte, weil die Fragment ist noch nicht vollständig angezeigt und daher existiert keine Karte?

Korrekt.

Irgendwelche Ideen, wie man es beheben kann?

Eigentlich die Layout-Datei verwenden, um setContentView() Aufruf und loszuwerden, alle die FragmentTransaction Sachen. Sie können dann rufen Sie die bereits erstellte SupportMapFragment und verwenden es:

setContentView(R.layout.activity_main); 

SupportMapFragment mapFrag=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment); 
+0

Danke, ich dachte darüber nach, aber kann ich die in GoogleMapOptions angegebenen Optionen in meinem Code dann in der XML-Datei einstellen oder später setzen? – cos4

+0

@ cos4: Es gibt Entsprechungen in der XML, obwohl einige Leute Probleme gemeldet haben, wenn sie diese in Eclipse wegen eines Eclipse/ADT Bugs benutzen. Wenn das nicht funktioniert, entfernen Sie das 'SupportMapFragment' im XML, ersetzen Sie es durch'FrameLayout', bleiben Sie bei Ihrer vorhandenen' FragmentTransaction' (gießen Sie das Fragment in das 'FrameLayout'), aber dann müssen Sie das verzögern arbeite ein wenig mit der 'GoogleMap' (zB Unterklasse' SupportMapFragment' und setze deinen Code in 'onActivityCreated()'). – CommonsWare

+0

Gibt es ein Dokument über Einstellungsoptionen für Maps in XML? Konnte keine finden ... Ansonsten, wenn ich SupportMapFragment trotzdem ableiten müsste, könnte ich auch eine Absicht von onActivityCreated() senden und sie von meiner aktuellen Aktivität abfangen ?! – cos4

14

Versuchen Sie den gesamten Code zu bewegen, die Ihre GoogleMap-onStart() oder onResume() verweist. Die Zuordnung in einem Zuordnungsfragment wird nicht instanziiert, bis das Fragment onCreateView (link) durchlaufen hat, was geschieht, nachdem die übergeordnete Aktivität onCreate() durchlaufen hat. Außerdem müssen Sie Ihre GoogleMap für null unabhängig überprüfen, denn wenn Google Play-Dienste nicht installiert sind oder die Karte aus einem anderen Grund nicht verfügbar ist, wird es null sein.

+0

Dies scheint bei weitem die einfachste Lösung zu sein, danke! –

+0

+1 für die Erklärung "warum?" sowie "was?". –

1

Sie haben OnMapReadyCallback zu implementieren, definieren ihre public void onMapReady(GoogleMap map) und verwenden Sie es auf dem Fragment zu arbeiten, wie in der Google API