2016-07-17 255 views
7

Ho un app GPS che funziona bene sul mio telefono. Tuttavia, vedo che c'erano persone con un'eccezione di puntatore nullo nella produzione.Android non riesce a trovare il metodo simbolo getMap()

SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 

    // Getting GoogleMap object from the fragment 
    googleMap = fm.getMap(); 

    // Enabling MyLocation Layer of Google Map 
    googleMap.setMyLocationEnabled(true); 

    googleMap.setPadding(0, 0, 0, 90); 

L'errore che sto ottenendo dalla produzione è Causato da:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.setMyLocationEnabled(boolean)' on a null object reference 

così ho fatto qualche ricerca e scoprire che il metodo getMap è stata rimossa e la gente consiglia di utilizzare getMapAsync(this);

@Override 
public void onMapReady(GoogleMap googleMap) { 
    this.googleMap = googleMap; //which doesn't seem to work 
} 

Tuttavia, sono riferimento la variabile googleMap in molti metodi differenti, e non posso spostare tutto il codice perMetodo. Ho provato ad utilizzare this.googleMap = googleMap all'interno del metodo onMapReady, ma sto ancora ricevendo eccezioni puntatore nullo ogni volta che provo a fare riferimento alla variabile googleMap. Ho definito getMapAsync (this) in onCreated(), quindi provo ad accedere all'oggetto 'googleMap' in onResume() e ad ottenere l'eccezione puntatore nullo. C'è un modo per risolvere questo problema? Grazie.

+0

si può mostrare il file di layout? –

risposta

2

come propongo nel this risposta.

getMap() è deprecato utilizzare getMapAsync() anziché nel modo seguente.

sostituire questo

googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMap(); 

con questo

googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMapAsync(this); 

per maggiori informazioni visita questo link

+3

Il tipo di ritorno di getMapAsync (nuovo OnMapReadyCallBack() {}) è nullo. – AnupamChugh

0

Certo che hai non corrispondenti al SupportMapFragment e MapFragment significa che se avete attributo class

class ="com.google.android.gms.maps.MapFragment" 

nella vostra XML quindi si dovrebbe utilizzare

MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); 

O

Se hai classe attr come

class="com.google.android.gms.maps.SupportMapFragment" 

allora si può fare come come si sta facendo.

6

Hai trovato un'eccezione di puntatore nullo perché si sta tentando di utilizzare google oggetto della mappa, ma google map oggetto è ancora nulla, quindi è necessario seguire questo passaggio. scrivere questo codice nel metodo di onCreate()

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

ora impleents la classe con public class Demo implements OnMapReadyCallback insomma è necessario eseguire l'override onMapReady (Googlemap googleMap) methood. è possibile eseguire tutte le azioni dopo la richiamata da onMapReady().

@Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
// Enabling MyLocation Layer of Google Map 
googleMap.setMyLocationEnabled(true); 
    } 
+0

Ho creato l'oggetto sopra in onCreate(), tuttavia, quando ho provato a utilizzare l'oggetto googleMap in onResume(), sto ancora ottenendo l'eccezione del puntatore nullo. – Julia

+0

Stai ricevendo un'eccezione del puntatore nullo in onResume() perché la tua mappa non è ancora pronta. – Alvi

1

Sostituire

googleMap = ((SupportMapFragment) getSupportFragmentManager() 
    .findFragmentById(R.id.googleMap)).getMap(); 

con

googleMap = ((SupportMapFragment) getChildFragmentManager() 
    .findFragmentById(R.id.map)).getMapAsync((OnMapReadyCallback);this);