Fragmento de Google Maps devolviendo nulo dentro de un fragmento

Así que tengo un fragmento vacío que contiene un fragmento de mapa. Cada vez que intento activar el fragmento que contiene el mapa, mi aplicación se bloquea y devuelve un error de puntero nulo en esta línea:

map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); 

Completo Mensaje de error:

 java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference at com.collusion.serviceassistant.ReturnVisitDetails.onViewCreated(ReturnVisitDetails.java:39) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:904) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 

Aquí está mi código de fragmento:

 import android.app.Activity; import android.app.Dialog; import android.net.Uri; import android.os.Bundle; import android.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class ReturnVisitDetails extends Fragment { static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_return_visit_add, container, false); return rootView; } public void onViewCreated(View view, Bundle savedInstanceState) { // Get a handle to the Map Fragment map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } } 

Y mi fragmento de origen de los padres XML:

 <RelativeLayout 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="com.collusion.serviceassistant.ReturnVisitDetails" android:background="#009688"> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment" /> </RelativeLayout> 

¿Alguien tiene una idea de por qué el fragmento de mapa está devolviendo null?

EDIT: Así que ahora tengo este código para inicializar el mapa:

 MapFragment mapFragment = new MapFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.rl_map_container, mapFragment).commit(); map = mapFragment.getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 

Y todavía devuelve un valor de puntero nulo

Este problema me sucedió cuando traté de portar mi proyecto Eclipse al proyecto de Android Studio.

 java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference 

Lo usé con una actividad de fragmentos como esta:

 ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapToday)).getMap(); 

Sin embargo, el problema era que antes usaba una versión específica de Google Play Services (4.3.23).

Pero la compilación de Gradle selecciona la versión más reciente ( compile 'com.google.android.gms:play-services:+')

He intentado alguna otra versión específica como (6.1.71). Pero todavía dio una excepción de punto nulo.

Utilicé la misma versión antigua que usé antes y funcionó.

 compile 'com.google.android.gms:play-services:4.3.23' 

Esto funciona para mí como una solución temporal. Sin embargo, esto será un problema cuando necesite actualizar a una nueva biblioteca de servicios de juegos.

Parece que no hay una biblioteca de mapas específica con esta versión disponible para Gradle construir cuando intento de esta manera:

 compile 'com.google.android.gms:play-services-maps:4.3.23' 

He resuelto el problema. esta línea cuando tengo un viewpager:

 mMap = ((SupportMapFragment) MainActivity.fragmentManager .findFragmentById(R.id.mapView)).getMap(); 

usted tiene que cambiar a esto:

  mMap = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.mapView)).getMap(); 

Tu clase se extiende desde Fragment , y estás usando un Fragment declarado en el diseño, pero el fragmento anidado sólo funciona cuando se añaden dinámicamente.

Así que tienes dos opciones:

1) Extender de FragmentAcivity vez de Fragment y aplicar los métodos apropiados.

2) Agregue el Fragment dinámicamente, como sigue:

// ReturnVisitDetails

 MapFragment mapFragment = new MapFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.rl_map_container, mapFragment).commit(); 

//Diseño

 <FrameLayout android:id="@+id/rl_map_container" android:layout_width="match_parent" android:layout_height="match_parent" /> 

–ACTUALIZADO–

Un ejemplo completo para usar Google Maps dentro de un Fragment :

// TestFragmentActivity

 public class TestFragmentActivity extends android.support.v4.app.FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_fragment_activity); } } 

// TestFragment

 public class TestFragment extends android.support.v4.app.Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.test_fragment, container, false); CustomMapFragment mapFragment = new CustomMapFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.map_container, mapFragment).commit(); return rootView; } } 

// CustomMapFragment

 public class CustomMapFragment extends com.google.android.gms.maps.SupportMapFragment { private final LatLng HAMBURG = new LatLng(53.558, 9.927); @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); GoogleMap googleMap = getMap(); googleMap.addMarker(new MarkerOptions().position(HAMBURG).title("Hamburg")); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); googleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } } 

//test_fragment_activity.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/map" class="your_package.TestFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 

//test_fragment.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/map_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> 

He buscado un montón de temas en esto como yo estaba teniendo el mismo problema con los servicios de google play más antiguos. Como Victor dijo que su clase se extiende desde el fragmento y tiene que usar otro fragmento definido en el diseño, así que mejor enfoque será utilizar getChildFragmentManager() lugar de getSupportFragmentManager() .

También el getMap() method is deprecated ahora como se menciona en google docs. Para obtener más información, consulte: – https://developers.google.com/android/reference/com/google/android/gms/maps/MapFragment.html#getMap ()

A continuación se muestra el código de trabajo que he probado en varios dispositivos de servicios de juegos antiguos. Esto generará el mensaje predeterminado en caso de que el dispositivo tenga servicios antiguos de google play y en caso de que el objeto de GoogleMap devuelva null:

 class MyFragment extends Fragment { SupportMapFragment myMapFragment; GoogleMap myMap; View convertView; FragmentManager fm; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { convertView=inflater.inflate(R.layout.mymap,null); fm=getChildFragmentManager(); myMapFragment=(SupportMapFragment) fm.findFragmentById(R.id.myMapId); // here instead of using getMap(), we are using getMapAsync() which returns a callback and shows map only when it gets ready. //it automatically checks for null pointer or older play services version, getMap() is deprecated as mentioned in google docs. myMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googlemap) { // TODO Auto-generated method stub myMap=googlemap; startMap(); } }); return convertView; } } 

Vea este hilo para más información.

¿Podría esto ser un problema de migrar a una versión sdk de destino de 21? Si es así, la siguiente solución puede ser de su interés:

MapFragment o MapView getMap () devuelve null en Lollipop

Intente utilizar SupportMapFragment en lugar de MapFragment. Este código funciona para mí para un fragmento, acaba de probarlo:

 import android.os.Bundle; 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.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class MapFragment extends Fragment { private GoogleMap map; static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_map, container, false); // Get a handle to the Map Fragment map = ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.map)).getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); return rootView; } } 

y su diseño:

 <RelativeLayout 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=".MainActivity" > <fragment android:id="@+id/map" android:name="com.example.test.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> </RelativeLayout> 

El problema puede estar relacionado con el hecho de que su targetSdkVersion es mayor que la versión de la Biblioteca de soporte de Android utilizada.

Ese fue mi caso, en uno de los proyectos que hemos estado trabajando en targetSdkVersion fue de 21, mientras que la versión de la Biblioteca de Soporte fue 19.0.0. El cambio de targetSdkVersion a 19 solucionó el problema.

Puedo enfrentar el mismo problema pero finalmente puedo solucionar ese error. Ahora el mapa está demostrando correctamente …

=> Llame al método initilizeMap () en Fragmento dentro de un método onCreateView () …

=> Declara Variable Global como,

 private GoogleMap googleMap; private void initilizeMap() { try { // Changing marker icon // marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon))); // adding marker if (googleMap == null) { googleMap = ((MapFragment)getActivity().getFragmentManager() .findFragmentById(R.id.map)).getMap(); // create marker MarkerOptions marker = new MarkerOptions().position( new LatLng(latitude, longitude)).title( "YourCare"); // Changing marker icon MarkerOptions icon = marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); // adding marker LatLng latLng = new LatLng(latitude, longitude); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom( latLng, 15); googleMap.animateCamera(cameraUpdate); // locationManager.removeUpdates(this); googleMap.addMarker(marker); googleMap.setMyLocationEnabled(true); // check if map is created successfully or not if (googleMap == null) { Toast.makeText(getActivity(), "Sorry! unable to create maps", Toast.LENGTH_SHORT) .show(); } } } catch (Exception e) { System.out.print("Error :" + e.getMessage()); } } 
  • Cómo crear punteros numerados dinámicamente en MapView?
  • Error invocar método virtual 'doble android.location.Location.getLatitude ()' en una referencia de objeto nulo
  • Google Maps android consigue longitude-latitud moviendo un marcador en el mapa
  • Principales diferencias entre el uso de Google Maps Javascript API v3 y Android MapView
  • Añadir una imagen a Android MapView
  • Ionic v2 API de Google Maps Error de compilación de Android: no se puede acceder a AbstractSafeParcelable options.compassEnabled (controls.getBoolean ("compass"));
  • No puedo encontrar la dependencia de maven para que las API de Google usen mapas
  • ¿Por qué el método onResume se va a ejecutar dos veces si la aplicación sigue ejecutando el método onCreate?
  • Cómo agregar valores en google map v2 marcador android?
  • Cómo añadir una barra de acción a la plantilla de actividad de Google Maps predeterminada en Android Studio
  • Java.io.IOException: No se puede analizar la respuesta del servidor en getFromLocationName ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.