7

J'ai implémenté une activité qui ajoute MapFragment lors de l'exécution. Le MapFragment xml a fragment statique et j'essaye d'obtenir l'adjonction à l'exécution. Aussi, j'ai trouvé qu'il y a quelques problèmes dans Lollipop en ajoutant le fragment de carte à l'exécution. Veuillez vérifier Issue raised et temporary solutionMapFragment provoquant NullPointerException à la méthode getMapAsync (this)

J'ai aussi donné mes codes ci-dessous,

fragment_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=".fragment.MapsFragment"> 

<fragment 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="appCreators.bloodfinder.activity.MapsActivity"/> 

<include 
    android:id="@+id/layout" 
    layout="@layout/template_custom_spinner"/> 

</FrameLayout> 

MapsFragment.java

Met en œuvre onMapReadyCallback

public class MapsFragment extends SupportMapFragment implements OnMapReadyCallback 

Dans onResume rappel

@Override 
public void onResume() { 
    super.onResume(); 
    ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 
} 

cela me retourne toujours nulle et je l'ai aussi essayé,

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

ce retour aussi NullPointerException

MapsActivity.java

getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, MapsFragment.newInstance()).commit(); 

Je l'ajoute à onCreate méthode de rappel d'activité. Je ne suis pas en mesure de comprendre pourquoi je reçois toujours NullPointerException!

Quelques fois je reçois Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

aide sera appréciée!

MISE À JOUR: Toujours pas résolu Je reçois l'erreur suivante. J'ai regardé dans les journaux, mais aucune idée pourquoi cela se produit.

Unable to resume activity {MapsActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 
+0

mis '((SupportMapFragment) getActivity() getSupportFragmentManager() findFragmentById (R.id.map)..) GetMapAsync (this);' 'ligne dans votre onCreateView()' ' – Pankaj

+0

et supprimer des outils:. Contexte = » appCreators.bloodfinder.activity.MapsActivity "' from 'fragment_map.xml' – Pankaj

+0

J'ai essayé mais pas de chance je reçois' Impossible de reprendre l'activité {MapsActivity}: java.lang.NullPointerException: Tentative d'invocation de la méthode d'interface 'void com.google .maps.api.android.lib6.e.fl.o() 'sur une référence d'objet null' –

Répondre

8

J'ai finalement résolu cette question pour moi-même en observant les réponses données en SO. J'ai comparé mon code et le code dans les réponses. Il me semble qu'il y a une certaine confusion au sujet de cette API et la mise en œuvre de Google est très large.Je suis cette exception jeté à plusieurs reprises:

Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 

Je ne sais toujours pas ce qui est mal avec certaines de ces mises en œuvre dans des questions qui sont SO obtiennent la même exception, mais cela a fonctionné pour moi et peut-être travailler pour quelqu'un d'autre.

Ce sont les choses que vous devez vérifier:

  1. Assurez-vous que ces deux (je n'avais que la api clé méta-données)

    <meta-data 
         android:name="com.google.android.geo.API_KEY" 
         android:value="@string/google_maps_key" /> 
        <meta-data 
         android:name="com.google.android.gms.version" 
         android:value="@integer/google_play_services_version" /> 
    
  2. Vous avez un fragment en XML comme celui-ci avec l'attribut class étant correct comme ci-dessous

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

Dans mon cas, le fragment de carte est un enfant, à l'intérieur d'un autre fragment.

Ce fragment parent ne devrait apparemment pas être un MapFragment ou un SupportMapFragment. Après l'avoir changé de SupportMapFragment en Fragment, la carte s'est montrée parfaitement bien.

public class ParentFragment extends Fragment { 

Je reste tout le reste comme avant, mais au lieu d'obtenir la carte dans onCreateView je suis arrivé dans onViewCreated comme ceci:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.rewards_google_map_area); 
    if (mapFragment != null) { 
     LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 
     if (locationManager != null && mapFragment.getMap() != null) { 
      googleMap=mapFragment.getMap(); 
      //after this you do whatever you want with the map 
     } 
    } 

} 

J'ai changé rien d'autre et je ne l'ai pas mess avec la rootView ou parentView. Comme vous le verriez dans la réponse de @Konstantin Loginov

Essayez-le et faites le moi savoir.

+0

Cela semble prometteur. Je vais essayer et vous faire savoir –

+0

Charme de lien travaillé! L'erreur que j'ai faite étend 'SupportMapFragment' au lieu de' Fragment'. Changer pour 'Fragment' travaillé. D'autres scénarios étaient parfaits dans mon cas. Merci beaucoup. –

+0

De rien. –

1

Je me suis battue avec un problème similaire il y a un certain temps. La clé était de getMap() dans un bon moment, en onViewCreated() du Fragment:

public class LocationFragment extends Fragment { 

    private SupportMapFragment locationMap; 
    private View rootView; 

    protected View getFragmentView() { 
     View view = getView(); 
     if (view == null) { 
      view = rootView; 
     } 
     return view; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = getFragmentView(); 
     if (rootView != null) { 
      ViewGroup parent = (ViewGroup) rootView.getParent(); 
      if (parent != null) { 
       parent.removeView(rootView); 
      } 
     } 

     try { 
      rootView = inflater.inflate(R.layout.fragment_signup_specify_location, container, false); 
     } catch (InflateException ex) { 
      Log.e(LOG_TAG, "Inflate Exception in onCreateView; Caused by map fragment", ex); 
     } 
     ...... 
     return getFragmentView(); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     locationMap = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.locationMap); 
     if (locationMap != null) { 
      LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 
      if (locationManager != null && locationMap.getMap() != null) { 
       locationMap.getMap().setMyLocationEnabled(true); 
      } 
     } 
    } 
} 

Et le XML pour elle ressemble à la vôtre:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <fragment 
     android:id="@+id/locationMap" 
     android:layout_above="@+id/locationLabelTextView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:name="com.google.android.gms.maps.SupportMapFragment" /> 
</FrameLayout> 

Puis, en onViewCreated() vous pouvez informer Activity, que votre fragment de carte est prêt à l'emploi.

je l'espère, il aide

+0

Je vais vérifier cela et vous le faire savoir! –

+1

Hey j'ai essayé, Mais je reçois cette erreur 'Impossible de reprendre l'activité {MapsActivity}: java.lang.NullPointerException: Tentative d'invoquer la méthode d'interface 'void com.google.maps.api.android.lib6.e.fl. o() 'sur une référence d'objet nul'. Je pense qu'il y a quelque chose d'autre qui cause ce problème! Et cela ne me donne pas la ligne exacte ou la cause du problème. J'ai assez googlé mais n'ai rien fini! –

+1

J'ai essayé cela. Même problème. Cette exception est toujours là. –

0

Dans mon cas, j'utilise statiquement MapView dans un xml de Fragment. Le problème était que je devais déplacer le transfert d'appel mMapView.onCreate(...) à onViewCreated(...) parce que dans onCreate()mMapView n'est pas encore gonflé. Si vous n'utilisez pas MapView alors vous devez vérifier à quel moment vous appelez getMap(). Je dois être après que le MapView interne soit gonflé.