web-dev-qa-db-fra.com

findFragmentById pour SupportMapFragment renvoie null dans Android Studio

Récemment, j'ai migré un projet d'Eclipse vers Android Studio. Tout est configuré et fonctionne correctement, sauf mon seul fragment qui utilise un SupportMapFragment. Le findFragmentById ci-dessous (qui fonctionnait lors de la construction dans Eclipse) revient maintenant nul :(

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

extrait 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"/>

Voici mes dépendances dans mon 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')
 }

Je n'ai changé aucun code dans le fichier xml ou la classe Fragment qui fonctionnait auparavant dans Eclipse.

37
J_Sizzle

À en juger par le fait que vous remplacez Fragment.onActivityCreated(), je suppose que votre mise en page contenant le fragment de carte est la mise en page de votre Fragment. Dans ce cas, le SupportMapFragment est un fragment enfant de votre hébergement Fragment. Lorsque vous essayez de le récupérer, vous utilisez le ActivityFragmentManager. Vous devriez plutôt utiliser votre FragmentFragmentManager:

Par exemple, ceci:

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

devient:

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

Oui. Cela ne fonctionne pas pour targetSdkVersion 21, si votre fragment de carte fait partie intérieure de Fragment (en raison de certains problèmes, qui mentionnait this et this ).

Comme la résolution temporaire peut conseiller une telle astuce:

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();
        }
    }
}
17
cosic

Toutes les réponses sont correctes dans leur manière respective. Il peut arriver que vous suiviez le code Java Java de quelqu'un qui fonctionne pour eux mais ne fonctionne pas pour vous car votre implémentation dans votre code xml est différente d'eux.

Alors laissez-moi vous donner mon avis sur la façon dont j'ai réussi à charger la carte à la fois Activity ainsi que Fragment

Activité:

 <fragment
    Android:name="com.google.Android.gms.maps.MapFragment"
    Android:id="@+id/map"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"/>

Classe Java:

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

En fragment:

<fragment
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"/>

Classe Java:

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

Le code suivant a fonctionné pour moi. J'utilisais Google Map dans un Fragment:

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