-2

Je veux implémenter une carte sur un fragment. Mais quand je l'appelle getMapAsync() donne un NullPointerException:Android Google Maps getMapAsync() donne NullPointer (essayé d'autres suggestions)

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 
                      at kontrolleur.radar.de.radar.fragment.MapFragment.inOnCreateView(MapFragment.java:33) 

MapFragment.class:

public class MapFragment extends BaseFragment implements OnMapReadyCallback { 

public static MapFragment create(){ 
    return new MapFragment(); 
} 

@Override 
public int getLayoutResId() { 
    return R.layout.fragment_map; 
} 

@Override 
public void inOnCreateView(View root, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_container); 
    mapFragment.getMapAsync(this); 
} 

private GoogleMap googleMap; 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    this.googleMap = googleMap; 
} 
} 

Le fragment établit dans un ViewPager btw.

Voici le fragment_map.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 

xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/map_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

Mon fichier Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="kontrolleur.radar.de.radar"> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/google_maps_key" /> 
    <meta-data android:name="com.google.android.maps.v2.API_KEY" 
     android:value="@string/google_maps_key" /> 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
    <activity android:name=".MainActivity" 
     android:theme="@style/FullScreenTheme"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

La clé api pose dans le google_maps_api.xml et est valide.

Ce que j'ai essayé:

D'abord, je remplacé le mapFragment par une nouvelle instance de SupportMapFragment. Mais cela n'a pas fonctionné et a mis un écran blanc sur le fragment.

Alors j'ai essayé de mettre le mapFragment.getMapAsync (this); dans différentes méthodes (comme onCreate, onViewCreated etc.). Encore une nullpointerexception.

J'ai aussi remplacé getChildFragmentManager() avec getActivity(). GetFragmentManager().

Ai-je raté quelque chose?

Mon MainActivity étend étend AppCompatActivity et BaseFragment Fragment si c'est une aide.

+0

Je sais ce que NullPointerException est. Mais je ne comprends pas pourquoi le SupportMapFragment ne peut pas être trouvé ou chargé –

+0

voté pour rouvrir parce que cette question ne concerne pas une incompréhension fondamentale de ce qu'est un 'NullPointerException' est plutôt sur les spécificités de pourquoi une certaine variable est nulle dans ce cas particulier. –

+0

@BenP. Je viens de changer la cible de dupe en un doublon exact. –

Répondre

0

Le problème est que la mise en page XML de votre Fragment définit un MapView, et non un SupportMapFragment. En tant que tel, l'appel à findFragmentById() renvoie null.

Remplacer cette balise:

<com.google.android.gms.maps.MapView 
    android:id="@+id/map_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

avec ceci:

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

Maintenant, je reçois un android.view.InflateException: ligne fichier XML binaire # 8: ligne fichier XML binaire # 8: Erreur de gonflage fragment de classe –

+0

Juste une supposition, mais je parie que c'est parce que vous re en utilisant une balise '' dans la disposition pour un 'Fragment', et des fragments enfant doivent être ajoutés en utilisant le' FragmentManager' retourné par 'getChildFragmentManager()' (et ne peut pas être ajouté directement via XML). –