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.
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.
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.
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);