En google maps V2 … fragment.getMap () devuelve null

¡No puedo conseguir el mapa! Todo lo que puedo obtener es nulo.

Aquí está el código.

public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SupportMapFragment fragment = new SupportMapFragment(); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, fragment).commit(); GoogleMap map; map = fragment.getMap(); //here i cant access this snippet because map = null if(map!=null){ UiSettings mm = map.getUiSettings(); map.setMyLocationEnabled(true); } } } 

El manifiesto:

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.anywhere_reminder" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <permission android:name="com.example.anywhere_reminder.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.anywhere_reminder.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.google.android.gms.BuildConfig" /> <activity android:name="com.example.anywhere_reminder.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value=" my key "/> </application> </manifest> 

Aquí está el 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=".MainActivity" > <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> </RelativeLayout> 

Traté de resolverlo como esta solución Google Maps Android API v2 lanza GooglePlayServicesNotAvailableException, fuera de fecha, SupportMapFragment.getMap () devuelve null .. pero aún no funcionó

ACTUALIZAR:

Tengo mi mapa trabajando ahora .. aquí está la versión de trabajo editada

  public class MainActivity extends FragmentActivity { private GoogleMap myMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager(); SupportMapFragment mySupportMapFragment = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map); myMap = mySupportMapFragment.getMap(); if(myMap!=null) myMap.setMyLocationEnabled(true); } 

Estás creando un fragmento dinámico, a través de un FragmentTransaction . Cuando llama a commit() , el fragmento aún no se ha agregado a la pantalla, porque la FragmentTransaction sólo se ha programado para ocurrir – no se ha producido todavía. Por lo tanto, el SupportMapFragment no se ha llamado con onCreateView() todavía, así que no hay GoogleMap .

Cambia a fragmentos estáticos (etiqueta <fragment> en un diseño) o retrasa el uso de GoogleMap hasta que se procese la transacción.

ExecutePendingTransactions () en la clase FragmentManager fue diseñado para solucionar este retraso. From documantstion: Después de que se compromete un FragmentTransaction con FragmentTransaction.commit (), está programado para ejecutarse asincrónicamente en el subproceso principal del proceso. Si desea ejecutar inmediatamente cualquier operación pendiente , puede llamar a esta función (sólo desde el hilo principal) para hacerlo. Tenga en cuenta que todas las devoluciones de llamada y otros comportamientos relacionados se realizarán desde esta llamada, así que tenga cuidado acerca de dónde se llama.

He extendido la clase MapFragment y agregado un oyente. El doc de getMap () dice:

… Nulo si la vista del fragmento aún no está lista. Esto puede suceder si el ciclo de vida del fragmento no ha pasado a través de onCreateView (LayoutInflater, ViewGroup, Bundle) aún ….

Entonces llamo al oyente después de onCreateView. Agrego la clase

 public class MySupportMapFragment extends SupportMapFragment{ private MySupportMapFragmentListener listener; public interface MySupportMapFragmentListener{ public void onMapCreated(GoogleMap googleMap); } // value taken from source code private static final String MAP_OPTIONS = "MapOptions"; public static MySupportMapFragment newInstance() { MySupportMapFragment f = new MySupportMapFragment(); return f; } public static MySupportMapFragment newInstance(GoogleMapOptions options) { MySupportMapFragment f = new MySupportMapFragment(); Bundle args = new Bundle(); args.putParcelable(MAP_OPTIONS, options); f.setArguments(args); return f; } // other newInstance methods ... /* (non-Javadoc) * @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle) */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { // TODO Auto-generated method stub super.onViewCreated(view, savedInstanceState); // here, as doc say, the map can be initialized, or the service is not available if(listener!=null){ listener.onMapCreated(getMap()); } } /** * @return the listener */ public MySupportMapFragmentListener getListener() { return listener; } /** * @param listener the listener to set */ public void setListener(MySupportMapFragmentListener listener) { this.listener = listener; } 

}

Después de la actividad o fragmento de llamada …

  mapFragment = MySupportMapFragment.newInstance(); mapFragment.setListener(new MySupportMapFragmentListener() { @Override public void onMapCreated(GoogleMap googleMap) { // TODO Auto-generated method stub if(googleMap!=null){ // service is unaviable } } 

Mover el fragmento de código:

GoogleMap mapa; Map = fragment.getMap ();

// aquí el mapa no es nulo

If (map! = Null) {

 UiSettings mm = map.getUiSettings(); map.setMyLocationEnabled(true); 

}

Al método onResume (), esto resolverá su problema.

Otra forma de resolverlo. Implementar una interfaz en el MapFragment para comunicarse con la actividad cuando esté lista para la creación de GoogleMap.

  @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); listener.onGoogleMapCreattion(); } 

A continuación, sólo tiene que implementar el oyente en la activtiy:

  @Override public void onGoogleMapCreation() { setUpMapIfNeeded(); } private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { mMap = mMapFragment.getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { // The Map is verified. It is now safe to manipulate the map. setUpMap(); } } } 
  • (MapView y 1700 elementos de superposición) .equals ("Slow")
  • Cómo obtener la ubicación actual en google map android
  • Google Maps Android V2 relleno con rotación alrededor del usuario
  • Grupo de mapas de Google con dirección
  • ¿Cuál es el enfoque correcto para crear una aplicación para Android?
  • Plaza en blanco en Google Maps
  • Cómo obtener el siguiente punto de inflexión desde el mapa de google - (Android)
  • Android google maps v2 problemas de rendimiento
  • Lado del servidor Routeboxer
  • Cómo dibujar las direcciones de carreteras entre dos geocódigos en android google map v2?
  • InfoWindow (Google Maps) captura de un evento de cierre de la ventana
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.