2012-12-28 21 views
17

Eventuali duplicati:
How do I know the map is ready to get used when using the SupportMapFragment?Google Play Servizio - SupportMapFragment.getMap() sempre tornare nulla

Attualmente sto testando l'API V2 nuove mappe ma sto davvero avendo difficoltà a raggiungere per funzionare correttamente.

Il mio problema è che getMap() restituisce sempre null.

Ho testato positivamente la chiamata in 3 punti diversi:

  1. onCreate()
  2. onResume()
  3. in un gestore che si chiama alcuni secondi dopo che la mappa è già visibile sullo schermo

Ecco il codice:

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

Qualcosa che sto facendo male?

+0

che in effetti è, un peccato che non ho trovato che domande via la funzione di ricerca :(Io posto la mia soluzione campione come una risposta Grazie CommonsWare – Goddchen

+0

In primo luogo, ciò che tipo di dispositivo su cui si stava eseguendo questo codice? Dispositivo fisico o emulatore (che potrebbe non aver installato Play Services) –

risposta

47

Come dichiarato da CommonsWare nella domanda collegata, il problema si verifica solo quando si crea lo SupportMapFragment a livello di codice e non un tag XML <fragment>.

Se creato a livello di programmazione, la mappa sarà disponibile nella chiamata onActivityCreated(). Così la mia soluzione è la seguente:.!

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

Trova bravo fratello +1 – Sameer

+7

Non si deve creare un frammento interno non statico perché il compilatore creerà automaticamente il costruttore per fornire classe esterna al frammento come argomento.Poi sulla ricreazione dei frammenti si ottiene 'InstantiationException' perché non esiste un costruttore vuoto predefinito per il frammento. –

+0

Come si può fare questo, ma anche fornire opzioni? Solitamente si istanzia con SupportMapFragment.newInstance (opzioni); – Deminetix