2014-10-27 7 views
33

Kürzlich habe ich ein Projekt von Eclipse nach Android Studio migriert. Alles ist eingerichtet und funktioniert gut, außer für mein ein Fragment, das ein SupportMapFragment verwendet. Die unten findFragmentById (das funktioniert, wenn in Eclipse Aufbau) wird nun der Rückkehr null :(findFragmentById für SupportMapFragment gibt null in Android Studio zurück

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

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

Hier sind meine Abhängigkeiten in meinem 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') 
} 

ich habe keinen Code in der xML-Datei oder das Fragment Klasse geändert, die in Eclipse zuvor gearbeitet.

+0

was lsActivity ist? Könnten Sie stattdessen getActivity() ausprobieren? – Y2i

+0

versucht mit getActivity() statt aber kein Glück .... lsActivity wird nur verwendet, um alle meine Aktivitäten erweitert ein Common und das ist nur so, ich muss nicht überall tippen. lsActivity = (MeineAktivität) getActivity(); meine Frage bearbeitet, um diese Verwirrung für andere zu vermeiden –

+0

tun Sie das Sir, nur einen Rückruf-Test .. kopieren Sie diesen Code und setzen Sie es in onresume() von Ihrem Fragment lifeclycle .. wenn es nicht Null zurückgibt, nun, es wird ein Callback Lil Problem, wenn es passiert, rufen Sie es direkt von Ihrem oncreatview-Methode und erhalten Sie die ID aus dem überhöhten Layout..directly .. hoffe, es hilft Ihnen .. – Elltz

Antwort

159

Gemessen an der Tatsache, dass Sie Fragment.onActivityCreated() überschreiben, nehme ich an, dass Ihr Layout, das das Kartenfragment enthält, das Layout für Ihre Fragment ist. In diesem Fall ist das SupportMapFragment ein Kind Fragment Ihres Hostings Fragment. Wenn Sie versuchen, es abzurufen, verwenden Sie die ActivityFragmentManager. Sie sollten stattdessen Ihre Fragment ‚s FragmentManager verwenden:

Zum Beispiel diese:

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

wird:

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

Gibt es wirklich einen Unterschied zwischen _Fragment.getActivity(). GetSupportFragmentManager() _ und _Fragment.getFragmentManager() _? Aus der Dokumentation scheint es, dass sie auf den ersten Blick dasselbe tun sollten. – harism

+3

Der Fragmentmanager der Aktivität verwaltet die direkten Fragmente der Aktivität. Jedes Fragment hat seinen eigenen FragmentManager, der die Kindfragmente dieses Fragments verwaltet. Ihre Aktivität enthält also Ihr Map-Hosting-Fragment im Manager. Dieses Map-Hosting-Fragment enthält das SupportMapFragment in * its * -Manager. – kcoppock

+0

Sollten Sie dann _Fragment.getChildFragmentManager() _ nicht aufrufen? Vielleicht bin ich aber falsch. – harism

13

Ja. Es funktioniert nicht für targetSdkVersion 21, wenn das Map-Fragment Teil von Fragment ist (aufgrund einiger Probleme, die this und this erwähnt haben).

Als vorübergehende Lösung können solche Trick Beratung:

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(); 
     } 
    } 
} 
+0

Warum ist das eine vorübergehende Lösung? –

+0

@ BartaTamás Es war ein Fehler, und ich denke, dass es bald behoben wird. Aber es ist immer noch nicht behoben. (Siehe Referenzen oben) – cosic

+0

Danke, ich sehe. Ich dachte, das ist eine Designentscheidung der Jungs von Google. –

2

Der folgende Code für mich gearbeitet. Ich war mit Google Map in einem Fragment:

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

Arbeit für mich ... Danke dir. –

1

Alle Antworten in ihrer jeweiligen Art und Weise korrekt sind. Es kann passieren, dass Sie dem Java-Code von jemandem folgen, der für sie arbeitet, aber nicht für Sie arbeitet, weil Sie in Ihrem XML-Code eine andere Implementierung als diese hatten.

So lassen Sie mich Ihnen meine Meinung geben, wie ich Karte in beiden Activity sowie Fragment

Aktivität laden verwaltet:

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

Java-Klasse:

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

In Fragment:

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

Java-Klasse:

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

getChildFragmentManager funktioniert nicht mit SupportMapFragment. Es sagt mir, "kann Methode nicht auflösen". – iBEK

Verwandte Themen