2012-12-28 17 views
17

Powiel możliwe:
How do I know the map is ready to get used when using the SupportMapFragment?Google Play Service - SupportMapFragment.getMap() zawsze zwraca wartość null

Ja obecnie testuje nowe Maps API V2 ale ja naprawdę kłopoty z dostaniem to działa poprawnie.

Mój problem polega na tym, że getMap() zawsze zwraca wartość null.

Ja testowałem połączenia w 3 różnych punktach:

  1. onCreate()
  2. onResume()
  3. w Handler, która jest wywoływana kilka sekund po mapie jest już widoczny na ekranie

Oto kod:

public class MapActivity extends FragmentActivity { 

private SupportMapFragment mMapFragment; 

@Override 
protected void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 
      setupMap(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    setupMap(); 
    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      setupMap(); 
     } 
    }, 5000); 
} 

private void setupMap() { 
    if (getSupportFragmentManager().findFragmentById(R.id.fragment) == null) { 
    mMapFragment = CustomMapFragment.newInstance(); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.map_wrapper, mMapFragment).commit(); 
    } 
    GoogleMap map = mMapFragment.getMap(); 
    if (map != null) { 
     mMapFragment.getMap().getUiSettings().setZoomControlsEnabled(true); 
     mMapFragment.getMap().getUiSettings().setZoomGesturesEnabled(true); 
     mMapFragment.getMap().setMyLocationEnabled(true); 
    } 
} 

Cokolwiek robię źle?

+0

to rzeczywiście jest, a szkoda, że ​​nie okaże się, że pytania przez funkcję wyszukiwania :(Będę pisać mój przykładowy obejście jako odpowiedź Dzięki CommonsWare – Goddchen

+0

Po pierwsze, co typ urządzenia, na którym uruchomiłeś ten kod? Fizyczne urządzenie lub emulator (który nie miał zainstalowanych Usług Play) –

Odpowiedz

47

Zgodnie z wyrażeniem CommonsWare w połączonym pytaniu, problem występuje tylko podczas tworzenia programowego tagu SupportMapFragment, a nie jako <fragment> XML.

Jeśli zostanie utworzona programowo, mapa będzie dostępna w wywołaniu onActivityCreated(). Więc moje obejście jest następująca:.!

mMapFragment = new SupportMapFragment() { 
      @Override 
      public void onActivityCreated(Bundle savedInstanceState) { 
       super.onActivityCreated(savedInstanceState); 
       GoogleMap map = mMapFragment.getMap(); 
       if (map != null) { 
        //Your initialization code goes here 
       } 
      } 
     }; 
+0

Dobry brat find +1 – Sameer

+7

Nie należy tworzyć niestatycznego wewnętrznego fragmentu, ponieważ kompilator automatycznie utworzy konstruktor w celu zapewnienia zewnętrzna klasa do fragmentu jako argumentu, a następnie odtwarzanie fragmentów otrzymasz 'InstantiationException' ponieważ nie ma domyślnego pustego konstruktora dla fragmentu –

+0

Jak możesz to zrobić, ale także dajesz opcje? Zwykle tworzymy instancję z SupportMapFragment.newInstance (opcje); – Deminetix

Powiązane problemy