proyecto - findFragmentById for SupportMapFragment devuelve nulo en Android Studio
importar apk android studio (4)
Recientemente migré un proyecto de Eclipse a Android Studio. Todo está configurado y funciona bien, excepto mi fragmento que usa un SupportMapFragment. El siguiente findFragmentById (que funcionó al construir en Eclipse) ahora devuelve nulo :(
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
SupportMapFragment m = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.safety_map));
fragmento de xml ...
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/safety_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="40dp"
map:cameraTargetLat="@string/livesafe_latitude"
map:cameraTargetLng="@string/livesafe_longitude"
map:uiZoomControls="false"
class="com.google.android.gms.maps.SupportMapFragment"/>
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á anulando
Fragment.onActivityCreated()
, supongo 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
hosting.
Cuando intentas recuperarlo, estás usando
Activity
FragmentManager
.
En su lugar, deberías usar el
Fragment
tu
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));
El siguiente código funcionó para mí.
Estaba usando Google Map en un
Fragment
:
SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map));
Si. No funciona para targetSdkVersion 21, si su fragmento de Mapa es parte interna de Fragment (debido a algunos problemas, eso menciona this y this ).
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();
}
}
}
Todas las respuestas son correctas en sus respectivas formas. Puede suceder que sigas el código java de alguien que funciona para ellos pero no para ti porque tenías una implementación diferente en tu código xml que ellos.
Déjame darte mi opinión sobre cómo logré cargar el mapa tanto en la
Activity
como en el
Fragment
Actividad:
<fragment
android:name="com.google.android.gms.maps.MapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Clase de Java:
MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
En fragmento:
<fragment
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Clase de Java:
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);