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:
- ¿Cómo crear un enlace para todos los dispositivos móviles que abre google maps con una ruta que empieza en la ubicación actual, destinando un lugar determinado?
- Creación de OnDragListener para Google Map v2 Fragment
- Añadir Google Maps API v2 en Mono para Android
- Mapa Ver instrucciones de dibujo usando google Directions API - decodificar polilíneas
- Cómo mostrar el modo de conducción real de la ruta por carretera en el mapa en Android
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
- Maps api v2 android Mi ubicación no funciona en 2.3.3
- Kindle Fire y Google Maps api
- Cómo ampliar la cámara para cubrir la ruta en android googlemap?
- Cómo actualizar dinámicamente un elemento de superposición específico
- Android :: Extendiendo MapActivity => excepción classNotFound
- ¿Hay alguna manera de mostrar las instrucciones de la ruta en Google Map API v2?
- Android - Google Maps api v2 - Desactivar el control de zoom
- ¿Cómo saber qué marcador se ha hecho clic en Google Maps v2 para Android?
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 obtener UTC de desplazamiento en segundos en android
- Adición de fotos a la galería en Google Play Kiosco