web-dev-qa-db-fra.com

mapFragment.getMapAsync (this) - NullPointerException

J'utilise la version com.google.Android.gms:play-services-maps:7.5.0 des services Google Maps. Lorsque j'essaie d'appeler ci-dessous, je reçois 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.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this); //error

    return inflater.inflate(R.layout.fragment_example_map, container, false);
}

fichier fragment_example_map.xml:

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="app.ExampleMap">

    <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"/>
</FrameLayout>
27
Neutrino

Vous essayez de trouver un fragment avant qu'il n'existe. Vous indiquez que la disposition qui contient le fragment est fragment_example_map.xml. Cependant, vous essayez de trouver le fragment de carte avant de gonfler ce fichier de disposition. Cela ne fonctionnera pas.

Au-delà de cela, vous semblez essayer d’obtenir le fragment de carte de l’intérieur d’un autre fragment, dans la méthode onCreateView() de ce fragment. Je ne sais pas pourquoi vous imbriquer des fragments ici, car il semble que cela rendra votre code plus complexe et plus fragile sans aucun avantage évident.

10
CommonsWare

utilisez getChildFragmentManager() à la place de getActivity().getSupportFragmentManager() dans le fragment.

comme:

SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this); 
18
Arun kumar

Si vous utilisez Android:name="com.google.Android.gms.maps.MapFragment" dans votre fragment, changez votre code avec:

MapFragment mapFragment1 = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        mapFragment1.getMapAsync(this);

Cependant, si vous utilisez Android:name="com.google.Android.gms.maps.SupportMapFragment"in dans votre fragment, utilisez ce code: 

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

cela fonctionne pour moi:

SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this); 
5
Rayan Teixeira

En fonction de la version Android ou du SDK version 5 et ultérieure, utilisez getChildFragmentManager () et en dessous, getFragmentManager ().

2
jan_013069

Face au même problème. Puisque vous utilisez le fragment Map d’un fragment, utilisez getChildFragmentManager () au lieu de getActivity (). GetFragmentManager () ou getFragmentManager ()

1
Devenom

utilisez ceci.

GoogleMap gooleMap;

     ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap map) {
            googleMap = map;
           }
1
Harsh Bhavsar

La réponse simple est si vous voulez ajouter un fragment de carte à cette

<fragment 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/map"
    Android:name="com.google.Android.gms.maps.SupportMapFragment"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:layout="@layout/fragment_home" />

Dans votre fragment: like this layout

 <Android.support.constraint.ConstraintLayout 
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
tools:context="com.example.Android.earthreport.fragments.HomeFragment"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="81dp">

     <fragment 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:tools="http://schemas.Android.com/tools"
            Android:id="@+id/map"
            Android:name="com.google.Android.gms.maps.SupportMapFragment"
            Android:layout_width="0dp"
            Android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="@id/guideline4"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@id/guideline3"
            tools:layout="@layout/fragment_home" />
        </Android.support.constraint.ConstraintLayout>

Ensuite, vous devez ajouter cette ligne après avoir gonflé le fragment comme ceci

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Find a reference to the {@link ListView} in the layout
        // Inflate the layout for this fragment
        // To get the referance we don't have findviewbyId 
        // method in fragment so we use view
        View view = inflater.inflate(R.layout.fragment_home, container, false);


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

Dans ton activité: like this layout

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

  <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:id="@+id/map"
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:context="package com.example.Android.map" />

</Android.support.constraint.ConstraintLayout>

alors vous devez ajouter ce morceau de code.

  @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        setContentView(R.layout.map_activity);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
      }

Corrigez-moi si je me trompe, mais ajoutez toujours un fragment de carte après avoir gonflé la présentation ou défini l'affichage du contenu.

1
badarshahzad

getFragmentManager () ne fonctionnera peut-être pas si vous utilisez map in fragment. Vous devez utiliser getChildFragmentManager () .

SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_track_order_map_fragment);
mapFragment.getMapAsync(this);

et ci-dessous est ma déclaration xml 

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

de plus, vous devez implémenter OnMapReadyCallback dans votre fragment.

1
varotariya vajsi

J'utilisais SupportMapFragment et en XML, j'ai défini MapFragment name attribut

Android:name="com.google.Android.gms.maps.MapFragment"

j'ai donc remplacé le code par SupportMapFragment et cela a bien fonctionné

Android:name="com.google.Android.gms.maps.SupportMapFragment"
0
Naveed Ahmad

Il suffit d'appeler supportMapFragment.getMapAsync(this); dans onResume dans votre activité

0
fanjavaid

remplace ce code

<fragment 
    Android:name="com.google.Android.gms.maps.MapFragment"
    Android:id="@+id/map"
    Android:layout_width="fill_parent"
    Android:layout_height="400dp" />

et

if (googleMap == null) {
        mapFrag =  (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        mapFrag.getMapAsync(this);
    }else{
        GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    }
0
Mujtaba Zaidi