Android: Wie benachrichtige ich die Aktivität, wenn Fragments-Ansichten bereit sind?

Ich benutze Google Maps API V2 in einer Aktivität wih Dropdown-Navigation, wo die Karte auf der zweiten Position ist.

Ich füge die Karte pragmatisch hinzu:

  • Ermittlung und Vermeidung von Android Scheduling Verzögerung
  • Wie man das Bild von der URL auf Android anzeigt
  • Auswahlfarbe auf LinearLayout
  • Speichern und Abrufen eines Klassenobjekts in gemeinsamer Präferenz
  • Android: Overlay TextView auf LockScreen
  • Android-Lese-externen Speicher gibt securityException
  • mMapFragment = supportMapFragment.newInstance(); getSupportFragmentManager() .beginTransaction() .replace(R.id.placeHolder, mMapFragment, TAG_MAP) .commit(); 

    Ich möchte das GoogleMap-Ovject bekommen, da die Dokumentation https://developers.google.com/maps/documentation/android/map sagt, dass es mit mMapFragment.getMap() getan werden mMapFragment.getMap() , aber es gibt null zurück.

    Nach http://developer.android.com/reference/com/google/android/gms/maps/SupportMapFragment.html gibt es null zurück, wenn das Fragment das onCreateView-Lifecycle-Ereignis nicht durchlaufen hat.

    Wie kann ich wissen, wann immer das Fragment fertig ist?

    EDIT: Ich habe das gefunden Wie kann ich wissen, dass die Karte bereit ist, sich bei der Verwendung des SupportMapFragments zu benutzen?

    Overriding onActivityCreated scheint wie eine Lösung, aber dann muss ich das Fragment durch einen Konstruktor instanziieren und nicht mit newInstance (), macht es einen Unterschied?

  • Zu viele Aktivitäten in Android?
  • Synchronisierungsdatenbanken Mysql SQLite
  • Debugging Android Widget Code In Eclipse
  • Webview load html aus Assets Verzeichnis
  • Was ist die Verwendung von Werten-v11 und Werte-v14 Ordner?
  • Medienlaufwerk in Android ändern?
  • 3 Solutions collect form web for “Android: Wie benachrichtige ich die Aktivität, wenn Fragments-Ansichten bereit sind?”

    Meine bevorzugte Methode ist, einen Rückruf zu verwenden, um ein Signal von einem Fragment zu bekommen. Auch dies ist die empfohlene Methode von Android bei der Kommunikation mit der Aktivität vorgeschlagen

    Für dein Beispiel, in deinem Fragment , füge eine Schnittstelle hinzu und registriere sie.

     public static interface OnCompleteListener { public abstract void onComplete(); } private OnCompleteListener mListener; public void onAttach(Activity activity) { super.onAttach(activity); try { this.mListener = (OnCompleteListener)activity; } catch (final ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnCompleteListener"); } } 

    Jetzt implementiere diese Schnittstelle in deiner Activity

     public class MyActivity extends FragmentActivity implements MyFragment.OnCompleteListener { //... public void onComplete() { // After the fragment completes, it calls this callback. // setup the rest of your layout now mMapFragment.getMap() } } 

    Nun, was auch immer in deinem Fragment bedeutet, dass es geladen ist, benachrichtige deine Activity dass es bereit ist.

     @Override protected void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create your fragment //... // signal that you're done and tell the Actvity to call getMap() mListener.onComplete(); } 

    Zusätzlich zu Kirks Antwort : Da die public void onAttach(Activity activity) abgelehnt ist, kannst du jetzt einfach benutzen:

     @Override public void onAttach(Context context) { super.onAttach(context); Activity activity; if (context instanceof Activity){ activity=(Activity) context; try { this.mListener = (OnCompleteListener)activity; } catch (final ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnCompleteListener"); } } } 

    Der Rest bleibt derselbe … Man könnte vielleicht (Fragment sender) als Parameter verwenden und immer passieren.

    Ich bin mir nicht sicher, ob ich dein Problem völlig verstehe, aber ich habe ein ähnliches Setup, wo ich ein Navigations-Dropdown-Menü verwende. Hier ist was für mich funktioniert

    1.) Laden Sie das Fragment aus einer XML-Datei und rufen Sie setupMapIfNeeded () auf

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.basicMap); setUpMapIfNeeded(); 

    Hier ist die XML-Datei als Referenz:

     <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/basicMap" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> 

    2.) Dann setze die Karte ein (Details zu isGoogleMapsInstalled (), siehe diese Frage )

      private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap(); // Check if we were successful in obtaining the map. if(isGoogleMapsInstalled()) { if (mMap != null) { mMap.setOnCameraChangeListener(getCameraChangeListener()); mMap.setInfoWindowAdapter(new MyCustomInfoWindowAdapter(this)); } } else { MapConstants.showDialogWithTextAndButton(this, R.string.installGoogleMaps, R.string.install, false, getGoogleMapsListener()); } } } 

    3.) Vergewissern Sie sich auch, setUpMapIfNeeded () von onResume () aufzurufen:

     public void onResume() { super.onResume(); setUpMapIfNeeded(); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.