6

Sto cercando di ottenere una mappa da un SupportMapFragment ma restituisce nulla. Da quello che ho letto questo potrebbe essere perché il frammento non è ancora completamente visualizzato e quindi nessuna mappa esiste ?! Ho provato a risolverlo usando executePendingTransactions() ma senza successo fino ad ora.mapFragment.getMap() restituisce null

Qualche idea su come risolverlo?

Ecco il codice

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

E il file di layout:

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

Esso restituisce il seguente registro

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

Qui avete dichiarato la variabile 'mapFragment'? – yugidroid

+0

Sì, l'ho dichiarato (modificato la parte del codice, vedi sopra) – cos4

+0

È inizializzato? Altrimenti sarà uguale a nulla, cioè "null". – yugidroid

risposta

1

Da quello che ho letto questo potrebbe essere perché il il frammento non è ancora completamente visualizzato e quindi nessuna mappa esiste?

Corretto.

Qualche idea su come risolverlo?

effettivamente utilizzare il file di layout, chiamando setContentView(), e di sbarazzarsi di tutte le cose FragmentTransaction. È quindi possibile recuperare il già creato SupportMapFragment e usarlo:

setContentView(R.layout.activity_main); 

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

Grazie, ci ho pensato, ma posso impostare le opzioni specificate in GoogleMapOptions nel mio codice, quindi nel file xml o impostarle in un secondo momento? – cos4

+0

@ cos4: Esistono equivalenti nell'XML, sebbene alcune persone abbiano segnalato problemi durante l'utilizzo di quelli in Eclipse a causa di alcuni bug di Eclipse/ADT. Se ciò non funziona, elimina il 'SupportMapFragment' nell'XML, sostituendolo con un' FrameLayout', attaccalo con il tuo 'FragmentTransaction 'esistente (versando il frammento nel' FrameLayout'), ma poi devi ritardare il tuo lavora un po 'con 'GoogleMap' (ad es. sottoclasse' SupportMapFragment' e inserisci il tuo codice in 'onActivityCreated()'). – CommonsWare

+0

Esiste un documento sull'impostazione delle opzioni per le mappe in XML? Impossibile trovare ... Altrimenti se dovessi sottomettere SupportMapFragment in ogni caso potrei anche inviare un intent da onActivityCreated() e prenderlo dalla mia attività corrente ?! – cos4

14

provare a spostare tutto il codice che fa riferimento il vostro GoogleMap-onStart() o onResume(). La mappa in un frammento di mappa non viene istanziata fino a quando il frammento non ha attraversato onCreateView (link), che si verifica dopo che l'attività principale ha attraversato onCreate(). Inoltre, devi controllare il tuo GoogleMap per null indipendentemente, perché se i servizi di riproduzione di google non sono installati, o la mappa non è disponibile per altri motivi, sarà null.

+0

Questa sembra essere di gran lunga la soluzione più semplice, grazie! –

+0

+1 per spiegare "perché?" così come "cosa?". –

1

Bisogna implementare OnMapReadyCallback, definire la sua public void onMapReady(GoogleMap map) e utilizzarlo per operare sul frammento, come indicato nel Google API