Ich habe das SDK auf die neueste Version (API 23) aktualisiert und die onAttach(Activity)
Methode für Fragment ist veraltet. Anstatt diese Methode zu verwenden, verwende ich jetzt, onAttach(Context)
aber diese wird während des Lebenszyklus nicht aufgerufen. Die Aktivität ist eine Instanz AppCompatActivity
von v7 und das Fragment ist eine Instanz der Klasse Fragment ( android.app.Fragment
).
Irgendwelche Ideen, wie man die onAttach
Arbeit in API 23 zum Laufen bringt?
Lösung
Ich habe einige Antworten gefunden, die Ihnen helfen können, dieses Problem zu verstehen und zu beheben:
Lösungen:
Wenn Sie getSupportFragmentManager () verwenden, werden Sie gezwungen, ein Fragment aus der Support-Bibliothek zu verwenden. Die erste Lösung besteht also darin, alle Fragmente durch das Fragment aus support lib zu ersetzen und getSupportFragmentManager () zu verwenden.
Die Lösung, die ich bereits implementiert habe, besteht darin, zwei Möglichkeiten zu behandeln (1. Die App wird auf einem Gerät mit API <23 ausgeführt, die App wird auf einem Gerät mit API> = 23 ausgeführt).
Kurz gesagt, in meiner Implementierung habe ich eine Basisklasse für alle Fragmente aus dem Projekt und ich habe diesen Code dort hinzugefügt:
/*
* onAttach(Context) is not called on pre API 23 versions of Android and onAttach(Activity) is deprecated
* Use onAttachToContext instead
*/
@TargetApi(23)
@Override
public final void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override
public final void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/*
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
}
Jetzt überschreibe ich einfach die onAttachToContext (Context) -Methode für alle Fragmente, bei denen ich dies benötige.
quelle
@Override
auf deinemonAttach(Context)
? Wenn nicht, fügen Sie es hinzu. Wenn Sie dann einen Compilerfehler erhalten, der sich darüber beschwert, dass dies nicht deronAttach(Context)
Fall ist , stellen Sie sicher, dass Sie sich auf Version 23 von befindenappcompat-v7
.AppCompatActivity
auch. Ich habe überschriebenonAttach(Activity)
undonAttach(Context)
beide wurden für mich gerufen. Getestet mit Nexus 5 (MPA44G), minSdk = 16, targetSdk = 23.Antworten:
Ich habe das Problem folgendermaßen gelöst:
@TargetApi(23) @Override public void onAttach(Context context) { //This method avoid to call super.onAttach(context) if I'm not using api 23 or more //if (Build.VERSION.SDK_INT >= 23) { super.onAttach(context); onAttachToContext(context); //} } /* * Deprecated on API 23 * Use onAttachToContext instead */ @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < 23) { onAttachToContext(activity); } } /* * This method will be called from one of the two previous method */ protected void onAttachToContext(Context context) {}
quelle
this.context = null
?Sie sollten versuchen, die Support-Bibliotheksversion von Fragment zu verwenden.
Sie müssen Schalter
import android.support.v4.app.Fragment;
stattimport android.app.Fragment;
. Sie müssen auch sicherstellen, dass SiegetSupportFragmentManager()
anstelle von verwendengetFragmentManager()
.quelle
Bitte poste hier über diesen BUG
AUSGABE AUF GOOGLE AOSP PROJECT HOMESITE ERÖFFNET:
https://code.google.com/p/android/issues/detail?id=185465
ps. Dies ist nicht Ihre Aufgabe, nach einer Lösung für dieses Problem zu suchen und irgendwelche Problemumgehungen zu finden. Aber Google zu zwingen, seine kaputte API zu reparieren! Um dies zu tun, musst du dich beschweren, wie ich sagte.
verwandtes Problem - getContext () aus Fragment:
https://code.google.com/p/android/issues/detail?id=185848
quelle
Ich habe mir das gleiche Problem ausgedacht. Ich habe eine minSdkVersion von 19 und eine targetSdkVersion von 23 und verwende fragmentManager in einer AppCompatActivity.
onAttach(Activity activity)
ist als veraltet markiert, aber ich habe App-Abstürze festgestellt, als ich es durch ersetzt habeonAttach(Context context)
.Stattdessen sind jetzt beide Versionen vorhanden, und wenn ich meine App auf API22 ausführe,
onAttach(Activity activity)
wird sie ausgelöst , obwohl sie als veraltet markiert ist.Ich habe es nicht auf einem Android Marshmallow-Gerät getestet, aber ich verstehe, dass es die
onAttach(Context context)
Version ausführen würde , wobei die andere ignoriert wird.Update , um die Beobachtung von @ skaar in den Kommentaren unten zu berücksichtigen: Ich konnte jetzt auf API23 testen und bestätigen, dass beim Ausführen auf Plattform 23 beide Methoden (mit Aktivität und Kontext) aufgerufen werden. Danke für die Warnung!
quelle
Nachdem ich Ihre Antwort @ David Rauca gelesen habe, denke ich, dass die zweite mein Problem lösen kann. Aber wenn ich in den Quellcode schaue. Ich fand, dass eigentlich
onAttach(Context context)
nichts auf Android M zu tun, nur die alte Methode genannt.Als Lösung:
@SuppressWarnings("deprecation")
Fügen Sie es einfach in die alte Methode ein, um die beste Lösung zu finden.
quelle
Ich bin auf das gleiche Problem gestoßen. Was ich getan habe, um es zu lösen:
Ändern Sie den Argumenttyp des onAttach-Rückrufs von Aktivität in Kontext . Aus unbekannten Gründen führt diese Änderung dazu, dass die Methode onAttach (Context) während des Fragmentlebenszyklus nicht mehr aufgerufen wird. Infolgedessen stürzte meine App ab, da der Code in der onAttach-Methode nie ausgeführt wurde.
Verschieben Sie den Code in der onAttach-Methode in onCreate one, da er noch ausgeführt wird.
Mit dieser Änderung funktioniert die App wie zuvor. Es
import
waren keine zusätzlichen Aussagen erforderlich.quelle
@Override public void onAttach(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { super.onAttach(context); onAttachToContext(context); } else { Activity activity = getActivity(); super.onAttach(activity); onAttachToContext(activity); } }
quelle