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>
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.
utilisez getChildFragmentManager()
à la place de getActivity().getSupportFragmentManager()
dans le fragment.
comme:
SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
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);
cela fonctionne pour moi:
SupportMapFragment mapFragment = (SupportMapFragment)getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
En fonction de la version Android ou du SDK version 5 et ultérieure, utilisez getChildFragmentManager () et en dessous, getFragmentManager ().
Face au même problème. Puisque vous utilisez le fragment Map d’un fragment, utilisez getChildFragmentManager () au lieu de getActivity (). GetFragmentManager () ou getFragmentManager ()
utilisez ceci.
GoogleMap gooleMap;
((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap map) {
googleMap = map;
}
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.
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.
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"
Il suffit d'appeler supportMapFragment.getMapAsync(this);
dans onResume
dans votre activité
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);
}