Ich habe meine App aktualisiert, um die neueste Support-Bibliothek (Version 23.0.0) zu verwenden. Ich habe festgestellt, dass die Funktion onAttach () der Fragment-Klasse nicht mehr unterstützt wird.
Anstatt:
onAttach (Activity activity)
Es schneit:
onAttach (Context context)
Da meine App die vor der Verwerfung übergebenen Aktivitäten verwendet, ist eine mögliche Lösung meiner Meinung nach:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Wäre das der richtige Weg?
AKTUALISIEREN:
Wenn ich ein Gerät mit einer API unter 23 ausführe, wird das neue onAttach () nicht einmal aufgerufen. Ich hoffe, dass dies nicht das ist, was sie vorhatten!
UPDATE 2:
Das Problem wurde mit den neuesten Updates für das SDK behoben.
Ich habe auf meinem API 22-Gerät getestet und onAttach (Context) wird aufgerufen.
Klicken Sie hier , um dem Fehlerbericht zu folgen, den ich vor ein paar Wochen geöffnet habe, und den Antworten der Jungs von Google.
quelle
Context
?Activity
Benötigen Sie keine , um ein Fragment anzuhängen und anzuzeigen? Wie werden Sie denContext
Parameter sonst noch verwenden ?onAttach(Context context)
Gerät aufgerufen werden kann, müssen Sie entweder ein Gerät mit mindestens API 23 verwenden oder android.support.v4.app.Fragment verwenden. Siehe hierAntworten:
Aktivität ist ein Kontext. Wenn Sie also einfach überprüfen können, ob es sich bei dem Kontext um eine Aktivität handelt, können Sie sie bei Bedarf umwandeln.
Update: Einige behaupten, dass die neue
Context
Überschreibung niemals aufgerufen wird. Ich habe einige Tests durchgeführt und kann kein Szenario finden, in dem dies wahr ist, und laut Quellcode sollte es niemals wahr sein. In allen Fällen habe ich sowohl vor als auch nach SDK23 getestet, sowohl dieActivity
als auch dieContext
Versionen vononAttach
aufgerufen. Wenn Sie ein Szenario finden, in dem dies nicht der Fall ist, empfehlen wir Ihnen, ein Beispielprojekt zu erstellen, das das Problem veranschaulicht, und es dem Android-Team zu melden .Update 2: Ich verwende immer nur die Fragmente der Android Support Library, da Fehler dort schneller behoben werden. Es scheint, dass das obige Problem, bei dem die Überschreibungen nicht korrekt aufgerufen werden, nur dann auftritt, wenn Sie die Framework-Fragmente verwenden.
quelle
onAttach(Context)
scheinen nicht einmal genannt zu werden.onAttach(context)
, nicht aufgerufen zu werden.Dies ist eine weitere große Veränderung von Google ... Die vorgeschlagene Änderung: ersetzen
onAttach(Activity activity)
mitonAttach(Context context)
abgestürzt meinen apps auf ältere APIs seitonAttach(Context context)
nicht auf nativen Fragmente bezeichnet werden.Ich verwende die nativen Fragmente (android.app.Fragment), daher musste ich Folgendes tun, damit es auf älteren APIs wieder funktioniert (<23).
Folgendes habe ich getan:
quelle
Wenn Sie die Framework-Fragmente verwenden und die SDK-Version des Geräts niedriger als 23 ist,
OnAttach(Context context)
dies nicht aufgerufen.Ich verwende stattdessen Unterstützungsfragmente, daher ist die Ablehnung behoben und wird
onAttach(Context context)
immer aufgerufen.quelle
Derzeit ist aus dem
onAttach
Fragmentcode nicht ersichtlich, obContext
es sich um die aktuelle Aktivität handelt: QuellcodeWenn Sie einen Blick darauf werfen, sehen
getActivity
Sie den gleichen AnrufAlso , wenn Sie wollen sicher sein , dass Sie die Aktivität verwenden Sie dann bekommen
getActivity()
(inonAttach
IhrerFragment
) , aber vergessen Sie nicht , zu überprüfen ,null
denn wennmHost
istnull
Ihre Aktivität wirdnull
quelle
quelle
Obwohl es in den meisten Fällen ausreicht
onAttach(Context)
, gibt es einige Telefone (z. B. Xiaomi Redme Note 2), auf denen es nicht aufgerufen wird, sodass NullPointerExceptions verursacht werden. Um auf der sicheren Seite zu sein, schlage ich vor, auch die veraltete Methode beizubehalten:quelle
Laden Sie die neueste Support-Bibliothek mit dem SDK-Manager herunter und fügen Sie sie hinzu
in gradle.app und setze die Kompilierungsversion auf api 23
quelle
Die folgende Antwort bezieht sich auf diese Verfallswarnung, die im Fragment-Tutorial auf der Android-Entwickler-Website angezeigt wird, und möglicherweise nicht auf die obigen Beiträge.
Ich habe diesen Code in der Tutorial-Lektion verwendet und es hat funktioniert.
Ich war besorgt, dass die Aktivität möglicherweise null ist, wie in der Dokumentation angegeben.
getActivity
FragmentActivity getActivity () Gibt die FragmentActivity zurück, der dieses Fragment derzeit zugeordnet ist. Kann null zurückgeben, wenn das Fragment stattdessen einem Kontext zugeordnet ist.
Das onCreate für die main_activity zeigt jedoch deutlich, dass das Fragment geladen wurde. Nach dieser Methode gibt der Aufruf von get activity aus dem Fragment die main_activity-Klasse zurück.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Ich hoffe ich bin damit richtig. Ich bin ein absoluter Neuling.
quelle
Sie verwenden wahrscheinlich
android.support.v4.app.Fragment
.onAttach
Verwenden Sie dazu anstelle der Methode nurgetActivity()
die,FragmentActivity
mit der das Fragment verknüpft ist. Andernfalls könnten Sie dieonAttach(Context context)
Methode verwenden.quelle
Dies funktionierte für mich, wenn ich die benutzerdefinierte Schnittstelle 'TopSectionListener' habe, deren Objektaktivitätsbefehl:
quelle