wake-up-neo.net

onAttach () wird nicht in Fragment aufgerufen

Mein Fragment ruft die onAttach(context)-Methode nicht auf, wenn es von AppCompatActivity gestartet wird.

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 von support.v4.Fragment ausdehne, onAttach(context) anrufen!

Was könnte das Problem sein?

Natürlich kann ich alle Fragmente aus v4.Fragment erweitern, aber ich möchte es nicht. Ist es eine schlechte Praxis? Projekt auch min sdk 14.

61
winston

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, wird onAttach(Context) aufgerufen. In allen vorherigen Android-Versionen wird onAttach(Activity) aufgerufen.

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

Support Libraries Fragment ist plattformunabhängig. Daher funktioniert es auf allen API-Versionen.

128
sockeqwe

Während Google möchte, dass wir nicht mehr veraltete APIs 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 KISS und die Einführung einer anderen Unterstützungsbibliothek tendiert dazu, meinen Apk auf etwa 1000 kb zu verdoppeln. Ich habe mein SDK erst gestern aktualisiert.

Der Grund dafür, dass die Typen hier nicht austauschbar sind, da sie in vielen Fällen der Fall sind, besteht darin, dass die Methode, die Activity verwendet, immer noch aufgerufen wird, wenn Activity bereitgestellt wird, da sie beide öffentlich sichtbar sind und Activity spezialisierter ist (als Unterklasse von ) Context hat Vorrang.

42
John

Zusätzlich zu den oben genannten Kommentaren glaube ich, dass es wichtig ist zu beachten, dass Sie, wenn Sie versuchen, die im Fragment enthaltenen Daten aus der übergeordneten Aktivität mit onAttach() zu aktualisieren, Probleme auftreten können, wenn sich die Auflistungsvariable in der Aktivität befindet null oder leer, wenn das Fragment aufgeblasen ist. An einem bestimmten Punkt innerhalb des Lebenszyklus Ihrer Aktivität kann sich Ihr Datenmodell ändern und muss innerhalb des Fragments aktualisiert werden. Sie können versuchen, einen Verweis auf ein bereits aufgeblähtes Fragment zu erhalten, finden jedoch beim Durchlaufen des Codes heraus, dass onAttach() niemals ausgelöst wird, selbst wenn die Überschreibung mit einem Context- oder Activity-Objekt verwendet wird.

Wenn Sie versuchen, einen Listener für das Fragment zu erstellen und den Listener mit der onAttach()-Callback-Methode zu initialisieren, wird onAttach() nicht ausgelöst, es sei denn, Sie geben den Tag-Parameter wie folgt an, wenn Sie das Fragment der 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);
0
mrfilter