onAttach() wird in Fragment nicht aufgerufen

Lesezeit: 4 Minuten

Benutzer-Avatar
Winston

Mein Fragment ruft nicht an onAttach(context) Methode, wenn es von gestartet wurde AppCompatActivity.

Fragmenterstellung in XML:

<fragment
    android:id="@+id/toolbar"
    class="package.MainToolbarFragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:layout="@layout/fragment_main_toolbar" />

Aber wenn ich es ausdehn support.v4.Fragment, onAttach(context) Anruf !

Was könnte das Problem sein?

Natürlich kann ich alle Fragmente aus verlängern v4.Fragment, aber ich will es nicht. Ist es schlechte Praxis? Projektieren Sie auch min SDK 14.

  • Ich denke, Sie sollten hier http://stackoverflow.com/questions/32083053/… besuchen. Hoffe, es wird klarer.

    – Akber

    16. September 2015 um 9:52 Uhr

Es wird nicht aufgerufen, weil diese Methode in API 23 hinzugefügt wurde. Wenn Sie Ihre Anwendung auf einem Gerät mit API 23 (Marshmallow) ausführen, dann onAttach(Context) wird angerufen werden. Auf allen vorherigen Android-Versionen onAttach(Activity) wird angerufen werden.

http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity)

Das Fragment der Unterstützungsbibliotheken ist plattformunabhängig. Daher funktioniert es auf allen API-Versionen.

  • Irgendeine Idee, ob ich beide implementieren sollte (für API 23-Geräte)? Wird onAttach(Activity) immer noch in API 23 aufgerufen?

    – Aviv Ben Shabat

    9. November 2015 um 8:35 Uhr

  • @sockeqwe Kudos an dich. Ich hatte irrtümlicherweise die neue Fragment-Klasse importiert und mir diese seit ein paar Stunden angesehen, ohne es zu bemerken. Vielen Dank

    – HenriqueMS

    29. März 2016 um 14:56 Uhr

  • @AvivBenShabat Sie sollten lieber die App-kompatible Version dieser API verwenden und nur die onAttach-Version (Kontextkontext) der Methode implementieren

    – Nicolás Carrasco-Stevenson

    14. Februar 2017 um 15:01 Uhr

  • Heutzutage sollten Sie verwenden androix Fragmente.

    – Minas Mina

    31. Mai 2019 um 13:59 Uhr

Benutzer-Avatar
John

Während Google möchte, dass wir aufhören, veraltete APIs zu verwenden

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    ...

Ist so neu, dass es nicht allgemein genannt wird. Sie müssen auch implementieren

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    ...

Für mich sind sie identisch, aber ich mag es KUSS und die Einführung einer weiteren Support-Bibliothek neigt dazu, meine apk auf etwa 1000 kb zu verdoppeln. Ich habe gestern erst mein SDK aktualisiert.

Der Grund, warum die Typen hier nicht austauschbar sind, wie dies in vielen Fällen der Fall ist, ist, dass die Methode eine an Activity wird immer noch aufgerufen, wenn ein Activity wird bereitgestellt, da sie sowohl öffentlich sichtbar sind als auch Activity ist spezialisierter als (als Unterklasse von) Context wird also Vorrang haben.

  • Die Verwendung der Support-Bibliothek ist nicht so schlimm. Ihr Ansatz wird zu einem seltsamen Verhalten führen, z. B. dass onStart() nicht jedes Mal aufgerufen wird.

    – ja

    4. Februar 2016 um 23:28 Uhr

  • @yehe könnten Sie vielleicht erläutern, was die Unterstützungsbibliothek zusätzlich zur Implementierung beider Methoden tut? Ich betrachte es als ein Paket von meist Polyfil-Korrekturen mit einigen Themen und Glitzern neuerer Versionen, um alten Geräten ein neues Gesicht zu geben. Ich sage nicht, dass das schlecht ist, aber wenn ich ein Framework auf Android verwende, ist es meistens irrelevantes Aufblähen.

    – John

    23. März 2016 um 14:31 Uhr

  • Die Implementierung von zwei Methoden funktioniert meiner Erfahrung nach auf vielen Geräten nicht. Habe es auf verschiedenen Nexus- und Samsung-Handys getestet, bei vielen funktioniert es nicht. Debugging zeigt onAttach(Activity activity) wird nicht jedes Mal aufgerufen. Bei der Verwendung der Support-Bibliothek bin ich nie auf seltsame Fehler gestoßen.

    – ja

    23. März 2016 um 23:23 Uhr

Zusätzlich zu den oben genannten Kommentaren ist es meines Erachtens wichtig zu beachten, dass, wenn Sie versuchen, die onAttach() Um Daten zu aktualisieren, die im Fragment der übergeordneten Aktivität enthalten sind, kann es zu Problemen kommen, wenn die Sammlungsvariable in der Aktivität null oder leer ist, wenn das Fragment aufgeblasen wird. Irgendwann im Lebenszyklus Ihrer Aktivität kann sich Ihr Datenmodell ändern und muss innerhalb des Fragments aktualisiert werden. Sie könnten versuchen, einen Verweis auf ein bereits aufgeblasenes Fragment zu erhalten, finden dies jedoch, wenn Sie Ihren Code durchgehen onAttach() wird nie ausgelöst, selbst wenn die Überschreibung verwendet wird, die ein Kontext- oder Aktivitätsobjekt enthält.

Wenn Sie versuchen, einen Listener für das Fragment zu erstellen und den Listener aus der onAttach() Callback-Methode, onAttach() wird nicht ausgelöst, es sei denn, Sie geben den Tag-Parameter wie unten gezeigt an, wenn Sie das Fragment zur Aktivität hinzufügen:

// in the Activity
getFragmentManager().beginTransaction()
    .add(
        R.id.fragmentContainer,
        CustomFragment.newInstance(customDataSource),
        CustomFragment.TAG // Must be passed in for the code below to work
    ).commit();


// Getting a reference to the fragment later on (say to update your data model inside the fragment (in onActivityResult())

CustomFragment fragmentDelegate = (CustomFragment) getFragmentManager().findFragmentByTag(CustomFragment.TAG);
fragmentListener.updateDataSource(customDataSource);

1216820cookie-checkonAttach() wird in Fragment nicht aufgerufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy