findFragmentById for SupportMapFragment devuelve nulo en Android Studio

Recientemente migré un proyecto de Eclipse a Android Studio. Todo está configurado y funciona bien, a excepción de mi único fragmento que utiliza un SupportMapFragment. El siguiente findFragmentById (que funcionó al construir en Eclipse) ahora está devolviendo null 🙁

public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); SupportMapFragment m = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.safety_map)); 

fragmento de xml …

   

Aquí están mis dependencias en mi build.gradle:

  dependencies { //google analytics compile 'com.google.apis:google-api-services-analytics:v3-rev103-1.19.0' //support library for api 10 compile 'com.android.support:support-v4:21.0.0' //google play services compile 'com.google.android.gms:play-services:6.1.11' compile project(':facebook') compile files('libs/android-support-multidex.jar') compile files('libs/aws-android-sdk-1.6.0-debug.jar') compile files('libs/FlurryAnalytics_3.3.2.jar') } 

No he cambiado ningún código en el archivo xml o la clase Fragment que anteriormente funcionaba en Eclipse.

A juzgar por el hecho de que está reemplazando a Fragment.onActivityCreated() , considero que su diseño que contiene el fragmento de mapa es el diseño de su Fragment . En ese caso, SupportMapFragment es un fragmento secundario de su Fragment alojamiento. Cuando intenta recuperarlo, está utilizando Activity FragmentManager . En su lugar, debe usar Fragment de su FragmentManager :

Por ejemplo, esto:

 SupportMapFragment m = ((SupportMapFragment) getActivity() .getSupportFragmentManager().findFragmentById(R.id.safety_map)); 

se convierte en:

 SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map)); 

Sí. No es trabajo para targetSdkVersion 21, si su fragmento de mapa es parte interna de Fragment (debido a algunos problemas que mencionaron esto y esto ).

Como resolución temporal puede aconsejar tal truco:

 public class MyFragment extends Fragment { private SupportMapFragment fragment; private GoogleMap map; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.layout_with_map, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getChildFragmentManager(); fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container); if (fragment == null) { fragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map_container, fragment).commit(); } } } 

El siguiente código funcionó para mí. Estaba usando Google Map en un Fragment :

  SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map)); 

Todas las respuestas son correctas en sus respectivas formas. Puede suceder que sigas el código java de alguien que funciona para ellos pero que no funciona para ti porque tienes una implementación diferente en tu código xml que ellos.

Así que déjame darte mi opinión de cómo pude cargar el mapa tanto en la Activity como en el Fragment

Actividad:

   

Clase de Java:

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

En Fragmento:

  

Clase de Java:

  SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);