Mapapi v2 en android causando error en el fragmento
Estoy teniendo poco problema en la aplicación del mapa en el fragment
. A continuación se muestra mi código.
import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; 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.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.tfick.android.R; public class PoiFragment extends Fragment{ private GoogleMap mGoogleMap; private static final LatLng SYDNEY = new LatLng(23.03,72.62); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v=inflater.inflate(R.layout.poi_fragment, container,false); MapFragment mMapFragment = MapFragment.newInstance(); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.container1, mMapFragment); fragmentTransaction.commit(); if(mGoogleMap ==null){ /*initializing map */ mGoogleMap=mMapFragment.getMap(); /*cretaing custom camera position*/ CameraPosition mCameraPosition=new CameraPosition.Builder().target(SYDNEY).bearing(0).tilt(30).build(); /*setting custom camera position*/ mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition)); /*adding custom marker on the map.*/ mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(22.03, 72.56)).title("hello world").snippet("Ahmedabad").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(23.03, 78.10)).title("hello world").snippet("Baroda").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); } if(mGoogleMap !=null){ /* map is already initialized then setting map type */ /* * normal * satellite * hybrid * terrain * none */ mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); } return v; } }
03-01 12:15:31.439: E/AndroidRuntime(9299): FATAL EXCEPTION: main 03-01 12:15:31.439: E/AndroidRuntime(9299): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tfick.android/com.tfick.android.PointOfIntrest}: java.lang.NullPointerException: CameraUpdateFactory is not initialized 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.access$600(ActivityThread.java:140) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.os.Handler.dispatchMessage(Handler.java:99) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.os.Looper.loop(Looper.java:137) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.main(ActivityThread.java:4898) 03-01 12:15:31.439: E/AndroidRuntime(9299): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 12:15:31.439: E/AndroidRuntime(9299): at java.lang.reflect.Method.invoke(Method.java:511) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 03-01 12:15:31.439: E/AndroidRuntime(9299): at dalvik.system.NativeStart.main(Native Method) 03-01 12:15:31.439: E/AndroidRuntime(9299): Caused by: java.lang.NullPointerException: CameraUpdateFactory is not initialized 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.internal.at.a(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.maps.CameraUpdateFactory.J(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.google.android.gms.maps.CameraUpdateFactory.newCameraPosition(Unknown Source) 03-01 12:15:31.439: E/AndroidRuntime(9299): at com.tfick.fragment.PoiFragment.onCreateView(PoiFragment.java:51) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.BackStackRecord.run(BackStackRecord.java:635) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.Activity.performStart(Activity.java:5215) 03-01 12:15:31.439: E/AndroidRuntime(9299): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073) 03-01 12:15:31.439: E/AndroidRuntime(9299): ... 11 more
- Azulejos personalizados borrosos en Android Maps V2
- Cómo obtener el centro del mapa para v2 android mapas?
- Cómo buscar en Google Map Api V2 Android?
- Barra de búsqueda de mapas en Google Maps v2
- Android Map API v2 no muestra mapa en algunos dispositivos
- Encuentra el restaurante más cercano, cafetería y supermercado usando google maps en android
- La API de Google Maps v2 no funciona
- No se pudo encontrar la clase 'com.google.android.gms.location.internal.ParcelableGeofence', referenciada desde el método glt.a
- Google Maps Android API v2: Visualización del radio de búsqueda con la ayuda de ValueAnimator
- Android Google Maps v2 problema de rendimiento polígono?
- Google Maps android consigue longitude-latitud moviendo un marcador en el mapa
- ¿Por qué la ventana de información del marcador no aparece?
- Cómo adjuntar un marcador flexible en el mapa algo así como Uber y Lyft?
Gracias a mí i encontrar la solución si alguna vez tienen el mismo problema de uso siguiente código.
import android.os.Bundle; import android.util.Log; 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.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.tfick.android.R; public class PoiFragment extends MapFragment { /*object of google map*/ public GoogleMap mGoogleMap; /* summy location*/ private static final LatLng SYDNEY = new LatLng(23.03, 72.62); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); if (getMap() != null) { Log.d(getClass().getSimpleName(), "Map ready for use!"); mGoogleMap = getMap(); /* cretaing custom camera position */ CameraPosition mCameraPosition = new CameraPosition.Builder() .target(SYDNEY).bearing(0).tilt(30).build(); Log.i("gmap", mGoogleMap.toString()); /* setting custom camera position */ mGoogleMap.animateCamera(CameraUpdateFactory .newCameraPosition(mCameraPosition)); /* adding custom marker on the map. */ mGoogleMap .addMarker(new MarkerOptions() .draggable(true) .position(new LatLng(22.03, 72.56)) .title("hello world") .snippet("Ahmedabad") .icon(BitmapDescriptorFactory .fromResource(R.drawable.wifi))); mGoogleMap .addMarker(new MarkerOptions() .draggable(true) .position(new LatLng(23.03, 78.10)) .title("hello world") .snippet("Baroda") .icon(BitmapDescriptorFactory .fromResource(R.drawable.wifi))); } } }
Inicialice CameraUpdateFactory.
Según la documentación –
Llamada Inicializar (Contexto) . Mientras no se lance una excepción GooglePlayServicesNotAvailableException , esta clase se inicializará correctamente.
Enlazar-
http://developer.android.com/reference/com/google/android/gms/maps/MapsInitializer.html#initialize(android.content.Context)
Cómo inicializar –
try { MapsInitializer.initialize(this /*the context*/); } catch (GooglePlayServicesNotAvailableException e) { e.printStackTrace(); }
Referencia – mapview y cameraupdate en api v2
El problema es que getMap()
devuelve null
y por CameraUpdateFactory
tanto CameraUpdateFactory
lanza las excepciones ya que necesita un GoogleMap
inicializado.
Tuve un problema similar al usar un MapFragment
dentro de un Fragment
. Lo solucioné moviendo la inicialización del mapa a OnResume
.
La implementación del mapa de Google depende en gran medida de varios métodos de ciclo de vida (onCreate, onCreateView, onDestroy, onResume y onPause). Debe retransmitir esas llamadas al MapFragment si lo encapsula dentro de su propio fragmento. El mapa ya debe ser inicializado después de llamar a mapView.getMap () y obtener un GoogleMap a cambio.
Si obtiene null de getMap (), varias cosas podrían haber ocurrido:
- No has llamado onCreate y / o onCreateView en el MapFragment (llamar a getMap () después de esos métodos)
- Te falta la entrada de la característica OpenGL ES 2 en tu manifiesto
- Te faltan los permisos necesarios para los mapas
- Los Servicios SDK de Google Play no están instalados en el dispositivo o son demasiado antiguos
He leído sobre la solución de inicialización (this) bastante a menudo aquí en StackOverflow, pero en realidad no es necesario en la mayoría de los casos.
EDIT: Acabo de ver que está agregando el Mapfragment a través de una transacción. ¿Ha considerado utilizar un MapView en su lugar dentro de su PoiFragment? Creo que al usar el MapFragment y agregarlo a través de una transacción obtendrá un problema de tiempo. La transacción no se ha terminado propably mientras que usted está todavía en su método de PoiFragment.onCreateView (por lo tanto mapas no se inicializa, todavía). Usted podría intentar usar onResume pero usted tendría que cerciorarse de, que usted init su código del mapa solamente una vez que onResume será llamado más a menudo.
Mis sugerencias en términos de arquitectura:
- Utiliza MapFragment directamente dentro de tu actividad si es factible
- Extiende el Mapfragment si tienes código suficiente para poner allí
Me enfrenté exactamente al mismo problema. Este error ocurre cuando getMap()
devuelve null
.
Hice lo siguiente:
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); googleMap = mapFragment.getMap(); /* if googleMap == null then there may be following problem : * 1. google play service version are not matching on both device and installed apk.Will show update message on map. * 2. No google play service installed. Will show a install message on map. */ if (googleMap != null) { LatLng iniLoc = new LatLng(44.97651081283853, -93.2245754142059); googleMap.moveCamera(CameraUpdateFactory.newLatLng(iniLoc)); googleMap.getUiSettings().setZoomGesturesEnabled(false); currentMarkerOption = new MarkerOptions(); currentMarkerOption.position(iniLoc); currentMarker = googleMap.addMarker(currentMarkerOption); currentMarker.setIcon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); currentMarker.setTitle("Current Position"); currentMarker.showInfoWindow(); currentMarker.setVisible(false); initDestinationMarker(); }
- Mi aplicación está instalada en el emulador, pero no se inicia automáticamente
- Cómo anular el botón de inicio de Android