MapFragment devuelve null

mMapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mMapFragment == null) { mMapFragment = SupportMapFragment.newInstance(); // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); mMap=mMapFragment.getMap(); 

Por este código el mapa es visible pero no se puede acceder al mapa

MMap = mMapFragment.getMap (); Show null value error cómo arreglar esto

Actualización 1: getMap() está obsoleto

Es mejor usar el método getMapAsync() de MapFragment/SupportMapFragment . El ejemplo de cómo utilizar el método que se muestra a continuación (copiado de su documentación ).

 import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; import android.app.Activity; import android.os.Bundle; public class MapPane extends Activity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map_activity); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { LatLng sydney = new LatLng(-33.867, 151.206); map.setMyLocationEnabled(true); map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); map.addMarker(new MarkerOptions() .title("Sydney") .snippet("The most populous city in Australia.") .position(sydney)); } } 

Citando Google MapFragment / SupportMapFragment

Un GoogleMap sólo puede ser adquirido con getMap () cuando el sistema de mapas subyacente se carga y la vista subyacente en el fragmento existe. Esta clase inicializa automáticamente el sistema de mapas y la vista; Sin embargo, no se puede garantizar que estará listo porque depende de la disponibilidad del APK de Google Play Services. Si GoogleMap no está disponible, getMap () devolverá null.

En su código, recupera inmediatamente GoogleMap DESPUÉS de Cometer MapFragment . Espere hasta que el MapFragment esté completamente cargado en la actividad para poder obtener GoogleMap .

Tal vez, puede entregar el GoogleMap de MapFragment a la Activity mediante la interfaz, como este.

 public class MyMapFragment extends SupportMapFragment { private MapCallback callback; public void setMapCallback(MapCallback callback) { this.callback = callback; } public static interface MapCallback { public void onMapReady(GoogleMap map); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(callback != null) callback.onMapReady(getMap()); } } public class MyActivity extends Activity implements MyMapFragment.MapCallback { // ......... @Override public void onCreate(Bundle onsavedInstanceState) { mMapFragment = (MyMapFragment) getSupportFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mMapFragment == null) { mMapFragment = MyMapFragment.newInstance(); mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } else { mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded } @Override public void onMapReady(GoogleMap map) { // Do what you want to map } } 

Importar parte

 import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; 

Dentro del edificio

 SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); mMap = mapFragment.getMap(); 

Y la parte Xml

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

Asegúrate de haber puesto

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

Dentro de las etiquetas <application></application> .

Y dar este permiso en el archivo de manifet

 <permission android:name="packagename.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="packagename.permission.MAPS_RECEIVE"/> <uses-permission android:name="android.permission.INTERNET"/> <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"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> 

Su xml debe tener SupportMapFragment

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

He resuelto este problema cuando pongo este código:

 @Override public void onPause() { Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); super.onPause(); } 

O pongo este código en onCreate

 if (mView != null) { ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { parent.removeView(mView); } } try { mView = inflater.inflate(R.layout.tab_map_layout, container, false); } catch (InflateException e) { } 

Después de la @ Glenn – comentario de Oct 1 '13 a las 6:05 para crear este pedazo de código fuente.

Mi implementación está reemplazando el SupportMapFragment con MapFragment y admite Google Maps versión 2

Quiero recordar de nuevo:

Un GoogleMap solo puede ser adquirido usando getMap () cuando el sistema de mapas subyacente está cargado y la vista subyacente en el fragmento existe. Esta clase inicializa automáticamente el sistema de mapas y la vista; Sin embargo, no se puede garantizar que estará listo porque depende de la disponibilidad del APK de Google Play Services. Si GoogleMap no está disponible, getMap () devolverá null.

Mi Implementación:

AndroidManifest.xml

 <!-- Permissions --> <!-- Used by the Google Maps API to download map tiles from Google Maps servers. --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!-- Allows the Google Maps API to check the connection status in order to determine whether data can be downloaded. --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- Allows the Google Maps API to cache map tile data in the device's external storage area. --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- Allows the Google Maps API to use WiFi or mobile cell data (or both) to determine the device's location. --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- Allows the Google Maps API to use the Global Positioning System (GPS) to determine the device's location to within a very small area. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Permissions --> <!-- Required OpenGL ES 2.0. for Maps V2 --> <!-- The Google Maps Android API uses OpenGL ES version 2 to render the map. If OpenGL ES version 2 is not installed, your map will not appear. sWe recommend that you add the following <uses-feature> element as a child of the <manifest> element in AndroidManifest.xml: --> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- Google Play Services --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <!-- Goolge Maps API Key --> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyATC4WBLLewjdwYDFVTnJH8hA18gG_GgvY" /> </application> 

Activity_main.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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="mapa.bg.MapaMainActivity" android:background="#ccc"> <!-- Google Map Container --> <RelativeLayout android:id="@+id/google_map_container" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- Google Map Container --> </RelativeLayout> 

ApplicationMapFragment.java

 public class ApplicationMapFragment extends MapFragment { private MapCallback callback; public void setMapCallback(MapCallback callback) { this.callback = callback; } public static interface MapCallback { public void onMapReady(GoogleMap map); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(callback != null) callback.onMapReady(getMap()); } /** * Initialize default Google Maps Options for our Application * @return GoogleMapOptions */ public GoogleMapOptions initializeGoogleMapsOptions() { GoogleMapOptions googleMapOptions = new GoogleMapOptions() .mapType(GoogleMap.MAP_TYPE_HYBRID); return googleMapOptions; } } 

MainActivity.java

 public class MainActivity extends Activity implements ApplicationMapFragment.MapCallback { // Get Class Name private static String TAG = MainActivity.class.getName(); // Create a new Map fragment private ApplicationMapFragment mapFragment; // Google Map Fragment Name private static String MAP_FRAGMENT_TAG = "google_maps_fragment"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { initilizeMapFragment(); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "Google Maps can't be loaded", e); } } /** * Initialize a new Map Fragment */ private void initilizeMapFragment() { // Try to get Map Fragment mapFragment = (ApplicationMapFragment) getFragmentManager() .findFragmentByTag(MAP_FRAGMENT_TAG); // We only create a fragment if it doesn't already exist. if (mapFragment == null) { mapFragment = new ApplicationMapFragment(); mapFragment.initializeGoogleMapsOptions(); // This activity will receive the Map object once the map fragment is fully loaded mapFragment.setMapCallback(this); // Then we add it using a FragmentTransaction. FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.google_map_container, mapFragment, MAP_FRAGMENT_TAG); fragmentTransaction.commit(); } else { // This activity will receive the Map object once the map fragment is fully loaded mapFragment.setMapCallback(this); } } @Override public void onMapReady(GoogleMap map) { Log.d(TAG, "Google Map is loaded"); MarkerOptions marker = new MarkerOptions() .position(new LatLng(10, 10)) .title("Hello World"); map.addMarker(marker); } } 

Realmente hackear la solución, pero, dado que el pobre fragmento API …

Tenga en cuenta que estoy haciendo esto desde una vista personalizada y acceder a la actividad usando (Activity) getContext ()

  addOnLayoutChangeListener(new OnLayoutChangeListener(){ @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { GoogleMap map = mapFragment.getMap(); if (map != null) { //Do stuff }else{ removeOnLayoutChangeListener(this); } } }); 
  • ¿Cómo obtener la ubicación actual en Google Maps Android API v2?
  • Técnica para ejecutar varias MapActivities en el mismo proceso
  • ¿Funciona el reconocimiento de actividad de Google en las versiones anteriores de Android?
  • Acceso a la dirección de casa / trabajo almacenada en Google Maps ("Mi lugar")
  • Google maps esconde el título de marcador en Android
  • Android Google Maps v2 - Tecla de depuración vs tecla de liberación
  • Google Maps no se muestra en el dispositivo Android
  • Marcadores del centro API V2 de Google maps
  • Inflar la excepción en el fragmento de mapa de Google en ViewPager con TabLayout
  • ¿Cómo puedo crear un mapa personalizado en Google Maps?
  • Android Studio Maps Api v2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.