Android – onAttach (Kontext) nicht für API 23 aufgerufen

Ich habe das SDK auf die neueste Version (API 23) aktualisiert und die onAttach(Activity) Methode für Fragment ist veraltet. Also anstatt diese Methode zu verwenden, jetzt benutze ich onAttach(Context) aber dieser wird nicht während des Lebenszyklus aufgerufen. Die Aktivität ist eine Instanz von AppCompatActivity aus v7 und das Fragment ist eine Instanz der Klasse Fragment ( android.app.Fragment ).

Irgendwelche Ideen, wie man die onAttach in API 23 zu bekommen?

  • Holen Sie sich den Index von enum aus string?
  • Bereinigen Sie unbenutzte Android-Berechtigungen
  • Jenkins Und Androide Build
  • Unsigned APK kann nicht installiert werden
  • Wo bekomme ich einen Open-Source-Radio-Treiber und RIL für ein Android-Handy?
  • Wie bekomme ich 20+ Ergebnis von Google Places API?
  • Lösung

    Ich habe einige Antworten gefunden, die Ihnen helfen können, dieses Problem zu verstehen und zu beheben:

  • Wie ich schon erwähnt habe, benutze ich die Aktivität von support v7 (AppCompatActivity) und das Fragment von android.app.
  • Für das Zeigen von Fragmenten bekomme ich den Fragmentmanager mit der Methode getFragmentManager auf die Aktivität, also ist der Fragmentmanager eine Instanz von FragmentManager von android.app -> und hier ist das Problem
  • Wenn Sie die Anwendung auf einem Gerät mit API 23 ausführen (ich habe es auf dem AS Emulator ausgeführt), sehen Sie, dass die onAttach (Context) Methode aufgerufen wird. Während des Prozesses zur Darstellung eines Fragments durch den FragmentManager wird zu einem bestimmten Zeitpunkt die Methode onAttach (..) aufgerufen. Mit dem getFragmentManager () bekommst du eine Instanz des Fragmentmanagers, die für die Android-Version verfügbar ist, die auf diesem Gerät läuft (zB API 22, 23). Falls die Anwendung auf einem Gerät mit API <23 läuft, ist die Methode onAttach (Context) nicht verfügbar, der Fragmentmanager weiß nicht, dass in API 23 eine Methode aufAttach (Kontext) vorhanden ist, also deshalb nicht aufgerufen wird Für die API <23 -> die Lösung für diese Art von Problemen ist die Verwendung der FragmentManager aus Support-Bibliotheken.
  • Lösungen:

    1. Mit getSupportFragmentManager () wird Sie zwingen, ein Fragment aus dem Support lib zu verwenden. Also die erste Lösung ist, alle Fragmente mit dem Fragment aus der Unterstützung lib zu ersetzen und mit getSupportFragmentManager () zu verwenden.

    2. Lösung, die ich bereits implementiert habe, besteht darin, 2 Möglichkeiten zu behandeln (1. die App läuft auf einem Gerät mit API <23, die App läuft auf einem Gerät mit API> = 23).

    Kurz, 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 übergebe ich einfach die onAttachToContext (Context) Methode auf alle Fragmente, wo ich das brauche.

  • SINGLE_TOP | CLEAR_TOP scheint 95% der Zeit zu arbeiten. Warum die 5%?
  • Android - Standard-Taste Stil
  • Rufen Sie Javascript-Funktion in Android WebView
  • Kräuselungen auf einer Form mit einem transparenten Hintergrund
  • Firebase Push Notification - Wie zeigt man eine Multiline-Nachricht in der Benachrichtigung an
  • Abonnieren von Themen mit Google Cloud Messenger Token, Ungültiges Argument erhalten
  • 6 Solutions collect form web for “Android – onAttach (Kontext) nicht für API 23 aufgerufen”

    Ich habe das Problem auf diese Weise 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) {} 

    Sie sollten versuchen, die Support-Bibliotheksversion von Fragment zu verwenden.

    Sie müssen zum import android.support.v4.app.Fragment; wechseln import android.support.v4.app.Fragment; Anstelle von import android.app.Fragment; . Sie müssen auch sicherstellen, dass Sie getSupportFragmentManager() anstelle von getFragmentManager() .

    Klage über diese BUG hier

    AUSGABE AUF DEM GOOGLE AOSP PROJECT HOMESITE:

    https://code.google.com/p/android/issues/detail?id=185465

    Ps Dies ist nicht Ihre Aufgabe, nach Lösung für dieses Problem zu suchen und jede Art von Workarounds zu finden .. aber um Google zu erzwingen, um seine gebrochene API zu beheben! Um dies zu tun, musst du mich beschweren, wie ich schon sagte.

    Verwandte Ausgabe – getContext () aus Fragment:

    https://code.google.com/p/android/issues/detail?id=185848

    Ich kam mit dem gleichen Problem. Ich habe eine MinSdkVersion von 19 und eine targetSdkVersion von 23 und ich benutze fragmentManager in einer AppCompatActivity.

    onAttach(Activity activity) ist als veraltet markiert, aber ich lief in App-Abstürze, wenn ich es mit onAttach(Context context) .

    Also stattdessen habe ich jetzt beide Versionen vorhanden und wenn ich meine App auf API22 laufe, wird onAttach(Activity activity) gefeuert , obwohl es als veraltet markiert ist.

    Ich habe es nicht auf einem Android Marshmallow Gerät getestet, aber mein Verständnis ist, dass es die onAttach(Context context) Version laufen würde, ignoriert die andere.

    Update zu berücksichtigen @ skaar die Beobachtung in den Kommentaren unten: Ich konnte jetzt auf API23 testen und kann bestätigen, dass auf der Plattform 23 bewirkt, dass beide Methoden (mit Aktivität und Kontext) aufgerufen werden. Danke für die Köpfe!

    Ich habe das gleiche Problem angetroffen Was ich getan habe, um es zu lösen:

    1. Ändern Sie den Argumenttyp von onAttach callback von Activity to Context . Aus unbekanntem Grund führt diese Änderung dazu, dass die Methode onAttach (Kontext) nicht mehr während des Fragmentlebenszyklus aufgerufen wird. Infolgedessen stürzte meine App, da der Code, der in onAttach-Methode war, noch nie ausgeführt wurde.

    2. Verschieben Sie den Code, der sich in onAttach-Methode auf onCreate, da es noch ausgeführt wird.

    Mit dieser Änderung wird die App wie bisher funktionieren. Es wurden keine zusätzlichen import benötigt.

    Nachdem ich deine Antwort gelesen habe @David Rauca Ich denke, die zweite kann mein Problem lösen. Aber wenn ich in den Quellcode schaue. Ich fand das eigentlich onAttach(Context context) nichts auf Android M, nur die alte Methode genannt.

    Als Lösung:

     @SuppressWarnings("deprecation") 

    Füge es einfach in die alte Methode ist die beste Lösung.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.