Wenn android's isValidFragment () von PreferenceActivity aufgerufen wird?

Für einige Anwendungen, auf denen ich arbeitete, für Geräte mit API Level 19 bekomme ich Ausnahme

Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com... has not checked if fragment com...$. is valid. 

Dann habe ich herausgefunden, dass für diese Anwendungen Android- protected boolean isValidFragment(String fragmentName) wird immer genannt, die Code hat

  • Aktualisieren von Activity TextView aus Service mit Service-Bindung
  • Sende Werte von ViewPager-Aktivität zu einem Fragment per Bündel
  • Start Aktivität aus Präferenz-Bildschirm (Absicht in XML-Datei definiert)
  • Zwei Trägerraketen für eine einzelne Tätigkeit
  • Wo ist die Layout-Datei meiner Einstellungen Aktivität?
  • NavigationDrawer-Aktivität ist mit Fragment-Callbacks und Anwendungs-Business-Logik verstopft
  •  if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { throw new RuntimeException( "Subclasses of PreferenceActivity must override isValidFragment(String)" + " to verify that the Fragment class is valid! " + this.getClass().getName() + " has not checked if fragment " + fragmentName + " is valid."); } else { return true; } 

    Dann habe ich versucht, den Fehler zu replizieren

    Ich nahm meine Beispiel-App-Code aus Preferences Activity Beispiel und fügte Zeile <uses-sdk android:targetSdkVersion="19" /> in manifest.

    Aber seltsam, ich bekomme nicht den Fehler (isValidFragment () nicht in diesem Fall angerufen).

    Also bitte sag mir, wie man diesen Fehler in meiner Beispiel-App repliziert.

  • Unit-Tests NPE, wenn ich Fragment benutzerdefinierte Übergänge hinzufügen
  • Wie kann man die Actionbar mit der neuen Designbibliothek API richtig verbergen und anzeigen?
  • Warum empfiehlt es sich nicht, Fragment mit UI zu behalten?
  • Android - Keine Aktivität gefunden zu behandeln Intent {act = android.intent.action.VIEW - Versuchen, eine PDF-Datei zu öffnen
  • Android Material Design Übergänge
  • Android Honeycomb: Wie man Fragmente in einem FrameLayout ändert, ohne sie neu zu erstellen?
  • 3 Solutions collect form web for “Wenn android's isValidFragment () von PreferenceActivity aufgerufen wird?”

    Scheint ein Fehler oder eine 4.4 Sicherheitsbeschränkung zu sein. Workaraound ist, etwas unter 19 zu verwenden, das immer noch mit PreferenceActivity kompatibel ist , und beißen die Aufzählung für das Kompilieren mit einem älteren Ziel.

    Ich benutze die Header "Pattern" für die PreferenceActivity ( public void onBuildHeaders(List<Header> target) ), und ich nehme an, dass das OP zu wahrscheinlich auch der Ort ist, an dem das Material passiert und abstürzt.

    In meinem Fall habe ich diese Ausnahme auf <uses-sdk android:targetSdkVersion="19" /> verengt, und alles in [14-18] baut Ziele kompilieren und laufen ohne Probleme.

    Vorschlag (für Eclipse): Ich habe mich nie direkt mit solchen Sachen verwirrt, aber ich nehme an, wenn du deine PreferenceActivity (und vielleicht Fragmente) auf einem anderen Projekt kompilierst, das auf 18 oder unter Targeting (Pun nicht beabsichtigt: O) gehe und dann benutze Das Projekt als Bibliothek für Ihr Hauptprojekt, das auf KitKat (19) abzielt, vielleicht können Sie das Crash-Szenario zur Laufzeit vermeiden, während Sie immer noch die Features nutzen, die Sie vom letzten Build benötigen (solange diese Features nicht im Build- 18-gebundene PreferenceActivity ). Wenn dies nicht gelingt, versuchen Sie es mit diesem Projekt in jar Form (vor-kompiliert) anstatt mit Projekt als Bibliothek.

    UPDATE : Beachten Sie auch die Antwort von Camille Sévigny. Wenn das Problem irgendetwas mit dieser anderen Frage zu tun hat (50% Chance IMHO), sind alle Apps, die API 18 ansprechen, anfällig für Fragment-Injection-Angriffe (siehe seine verknüpfte Frage).

    Die Antwort auf Ihre Frage ist in diesem Beitrag. Dies ist eine doppelte Frage:

    IsValidFragment Android API 19

    –Aktualisiert–

    Hier ist die Lösung:

    Grundsätzlich, welche Aktivität ist mit Ihrem Fragment "com … $" in den Fehler oben, müssen Sie es mit dem Update unten zu aktualisieren. Sie sollten alle Aktivitäten in Ihrem Projekt mit diesem Update für jede Acitvity aktualisieren, die ein Fragment verwendet.

    In der Dokumentation heißt es:

     protected boolean isValidFragment (String fragmentName) Added in API level 19 Subclasses should override this method and verify that the given fragment is a valid type to be attached to this activity. The default implementation returns true for apps built for android:targetSdkVersion older than KITKAT. For later versions, it will throw an exception. 

    Sie können diesen Fehler beheben, indem Sie diese Methode auf die Aktivität / FragmentActivity überschreiben:

     @Override protected boolean isValidFragment (String fragmentName) { return [YOUR_FRAGMENT_NAME_HERE].class.getName().equals(fragmentName); } 

    Wenn du faul bist und einfach nur ausprobieren willst, wenn dieses Update vor dem Codieren aller deiner Fragmente in diese Methode funktioniert, kannst du einfach ohne irgendwelche Prüfung zurückkehren:

     @Override protected boolean isValidFragment (String fragmentName) { return true; } 

    Ich hatte die gleichen Probleme beim Testen auf dem Emulator und das war die Lösung.

    Bitte schön!

    Klappe hier hinein, und du bist gut!

    Sammle alle inneren Klassen, die in dieser PreferenceActivity gefunden wurden. Ich entschied mich, die Liste in eine statische Feldvariable zu setzen:

     public class whatever extends PreferenceActivity { static final Class<?>[] INNER_CLASSES = whatever.class.getDeclaredClasses(); 

    Dann überschreiben Sie die Methode, ValidFragment, und stellen Sie sicher, dass das Fragment über angezeigt werden kann, ist eine der "Eltern" -Aktivität bewusst:

      /** * Google found a 'security vulnerability' and imposed this hack. * Have to check this fragment was actually conceived by this activity. */ @Override protected boolean isValidFragment(String fragmentName) { Boolean knownFrag = false; for (Class<?> cls : INNER_CLASSES) { if ( cls.getName().equals(fragmentName) ){ knownFrag = true; break; } } return knownFrag; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.