6

Próbuję uzyskać mapę z obiektu SupportMapFragment, ale zwraca wartość null. Z tego co przeczytałem może wynikać, że fragment nie jest jeszcze w pełni wyświetlony i dlatego nie istnieje żadna mapa ?! Próbowałem naprawić go przy użyciu executePendingTransactions(), ale bez powodzenia do tej pory.mapFragment.getMap() zwraca wartość null

Wszelkie pomysły, jak to naprawić?

Oto kod

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

a plik układ:

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

Zwraca następujące dziennik

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

Tu pan ogłosił 'zmienną mapFragment'? – yugidroid

+0

Tak, ja to zadeklarowałem (edytowałem część kodu, patrz wyżej) – cos4

+0

Czy jest zainicjowana? W przeciwnym razie będzie to to samo, co nic, tzn. "Null". – yugidroid

Odpowiedz

1

Z tego co czytałem to może być fakt, że fragment nie jest jeszcze w pełni wyświetlony i dlatego nie istnieje mapa?

Prawidłowo.

Wszelkie pomysły, jak to naprawić?

Właściwie użyj pliku układu, dzwoniąc pod numer setContentView() i pozbyć się wszystkich rzeczy z FragmentTransaction. Następnie można pobrać już utworzone SupportMapFragment i używać go:

setContentView(R.layout.activity_main); 

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

Dzięki, pomyślałem o tym, ale czy mogę ustawić opcje określone w GoogleMapOptions w moim kodzie, a następnie w pliku xml lub ustawić je później? – cos4

+0

@ cos4: Istnieją odpowiedniki w kodzie XML, chociaż niektóre osoby zgłosiły problemy podczas korzystania z tych w środowisku Eclipse z powodu jakiegoś błędu Eclipse/ADT. Jeśli to nie działa, pozbądź się 'SupportMapFragment' w XML, zastępując go' FrameLayout', trzymaj się istniejącej 'FragmentTransaction' (wlewając fragment do' FrameLayout'), ale wtedy musisz opóźnić pracować z 'GoogleMap' dla bitu (np. podklasa' SupportMapFragment' i umieścić swój kod w 'onActivityCreated()'). – CommonsWare

+0

Czy jest jakiś dokument dotyczący opcji ustawień map w języku XML? Nie mogłem znaleźć żadnych ... W przeciwnym razie, jeśli mam do podklasy SupportMapFragment mimo to mogę również wysłać intencję z onActivityCreated() i złapać go z mojej bieżącej działalności ?! – cos4

14

Spróbuj przenieść cały kod, który odwołuje się do swojej GoogleMaponStart() lub onResume(). Mapa w fragmencie mapy nie jest tworzona do momentu, w którym fragment przeszedł przez onCreateView (link), co dzieje się po przejściu nadrzędnej aktywności onCreate(). Poza tym musisz sprawdzić, czy nie jest to GoogleMap dla null, ponieważ jeśli usługi Google Play nie są zainstalowane lub mapa nie jest dostępna z innego powodu, będzie to null.

+0

To chyba zdecydowanie najprostsze rozwiązanie, dziękuję! –

+0

+1 za wyjaśnienie "dlaczego?" a także "co?". –

1

Trzeba wdrożyć OnMapReadyCallback, określić swoje public void onMapReady(GoogleMap map) i użyć go do działania na fragmencie jak stwierdzono w Google API