varios studio marcadores google example ejemplos ejemplo demos agregar android google-maps android-maps-v2

android - studio - mapFragment.getMapAsync(this)-NullPointerException



google maps api key android (13)

Estoy usando com.google.android.gms:play-services-maps:7.5.0 versión com.google.android.gms:play-services-maps:7.5.0 de los servicios de Google Maps. Al intentar llamar a continuación obtengo 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); }

archivo 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>


Enfrentado con el mismo problema. Como está utilizando el fragmento de Mapa dentro de un Fragmento, use getChildFragmentManager () en lugar de getActivity (). GetFragmentManager () o getFragmentManager ()


Está intentando encontrar un fragmento antes de que exista. Indicas que el diseño que tiene el fragmento es fragment_example_map.xml . Sin embargo, está tratando de encontrar el fragmento de mapa antes de inflar ese archivo de diseño. Esto no funcionará.

Más allá de eso, parece que estás tratando de llegar al fragmento del mapa desde dentro de otro fragmento, en el método onCreateView() ese fragmento. No sé por qué están anidando fragmentos aquí, ya que parece que hará que su código sea más complejo y más frágil sin ningún beneficio obvio.


Estaba usando SupportMapFragment y en XML definí el atributo de nombre MapFragment

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

entonces reemplacé el código con SupportMapFragment y comenzó a funcionar bien

android:name="com.google.android.gms.maps.SupportMapFragment"


La respuesta simple es si desea agregar Fragmento de mapa esto

<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" />

En tu fragmento: como este diseño

<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>

Luego debes agregar esta línea después de inflar el fragmento como este

@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); .....

En tu actividad: como este diseño

<?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>

entonces tienes que agregar este trozo de código.

@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); }

Corrígeme si estoy equivocado, pero siempre agregue el fragmento de mapa después de inflar el diseño o establecer la vista de contenido.


Mi comentario en los mapas con fragmento, primero debes volver a ver tu vista, ya que llamarás algo de ella, esta es la razón por la que primero inflico mi vista
View view = inflater.inflate(R.layout.activity_maps, null, false);

Segunda llamada child fragment manager this.getChildFragmentManager() lugar de getActivity().getSupportFragmentManager()

Aquí está el ejemplo completo para ver el mapa

import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class ClinicFragment extends Fragment implements OnMapReadyCallback { private GoogleMap mMap; public static ClinicFragment newInstance() { ClinicFragment fragment = new ClinicFragment(); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_maps, null, false); SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); return view; } /** * Manipulates the map once available. * This callback is triggered when the map is ready to be used. * This is where we can add markers or lines, add listeners or move the camera. In this case, * we just add a marker near Sydney, Australia. * If Google Play services is not installed on the device, the user will be prompted to install * it inside the SupportMapFragment. This method will only be triggered once the user has * installed Google Play services and returned to the app. */ @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // Add a marker in Sydney and move the camera LatLng sydney = new LatLng(-34, 151); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); } }

permiso requerido

<permission android:name="your.package.name.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-permission android:name="your.package.name.permission.MAPS_RECEIVE"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <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" />

más elemento de función

<uses-feature android:glEsVersion="0x00020000" android:required="true"/>

la mayoría de las importaciones de google maps key

<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your_key_here" />

Actualiza agrega esta metadatos si te enfrentas a un error al inflar el fragmento de la clase

<meta-data android:name="com.google.android.geo.API_KEY" android:value="your_key_here" />

veraniego para mainfest

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="your.package.name" > // permission here <application android:name=".Activities.MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > // feature element // maps key </application> </manifest>

activity_maps.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" 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:context="com.imaadv.leaynik.ClinicFragment" />


Reemplace este código

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

y

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


Según la versión de Android o SDK versión 5 y superior, use getChildFragmentManager () y a continuación use getFragmentManager ().


Si está usando android:name="com.google.android.gms.maps.MapFragment" en su fragmento, cambie su código con:

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

Sin embargo, si estás usando android:name="com.google.android.gms.maps.SupportMapFragment" en tu fragmento, utiliza este código:

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


Simplemente llame a supportMapFragment.getMapAsync(this); en onResume en tu actividad


esto funciona para mí:

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


getFragmentManager () puede no funcionar cuando está utilizando map dentro de fragmento. Tienes que usar getChildFragmentManager () .

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

y abajo está mi declaración 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" />

también necesita implementar OnMapReadyCallback en su fragmento.


use getChildFragmentManager() en lugar de getActivity().getSupportFragmentManager() en el fragmento.

me gusta:

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


utilizar esta.

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