wenn android isValidFragment () von PreferenceActivity aufgerufen wird?

7

Bei einigen Anwendungen, an denen ich gearbeitet habe, bekomme ich bei Geräten mit API-Stufe 19 eine Ausnahme

%Vor%

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

hat %Vor%

Dann habe ich versucht, den Fehler zu replizieren

Ich habe den Code meiner Beispiel-App aus dem Beispiel für die Vorzugsaktivität übernommen und die Zeile <uses-sdk android:targetSdkVersion="19" /> in Manifest hinzugefügt.

Aber seltsamerweise bekomme ich den Fehler nicht (isValidFragment () wird in diesem Fall nicht aufgerufen).

Bitte sagen Sie mir, wie ich diesen Fehler in meiner Beispiel-App replizieren kann.

    
Shirish Herwade 06.01.2014, 16:06
quelle

3 Antworten

6

Scheint ein Fehler oder eine Sicherheitsbeschränkung zu sein. Workaraound verwendet etwas unter 19, das immer noch mit PreferenceActivity kompatibel ist, und beißt die Kugel, um mit einem älteren Ziel zu kompilieren.

Ich verwende die Header "pattern" für die PreferenceActivity (überschreiben public void onBuildHeaders(List<Header> target) ), und ich nehme an, dass das OP auch ist, wahrscheinlich der Ort, wo Sachen passiert und abstürzt.

In meinem Fall habe ich diese Ausnahme auf <uses-sdk android:targetSdkVersion="19" /> eingeschränkt, und alles in [14-18] Build-Zielen kompiliert und läuft ohne Probleme.

Suggestion (für Eclipse): Ich habe nie direkt mit solchen Sachen durcheinander gebracht, aber ich nehme an, wenn Sie Ihre PreferenceActivity (und vielleicht Fragmente) in einem anderen Projekt kompilieren, das auf 18 oder darunter zielt (Wortspiel nicht beabsichtigt: O ) und dann dieses Projekt als library für Ihr Hauptprojekt verwenden, das auf KitKat (19) abzielt, können Sie möglicherweise das Crash-Szenario zur Laufzeit vermeiden, während Sie die Funktionen des neuesten Builds verwenden ( solange diese Features nicht in der Build-18-gebundenen PreferenceActivity sind). Wenn dies nicht gelingt, versuchen Sie es mit dem Projekt im jar -Formular (vorkompiliert), anstatt das Projekt als Bibliothek zu verwenden.

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

    
leRobot 10.02.2014, 14:59
quelle
20

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

isValidFragment Android API 19

- Aktualisiert -

Hier ist die Lösung:

Grundsätzlich, egal welche Aktivität Ihr Fragment "com ... $" in dem obigen Fehler verwendet, müssen Sie es mit dem Update unten aktualisieren. Sie sollten alle Aktivitäten in Ihrem Projekt mit diesem Fix für jedes Acitvity aktualisieren, das ein Fragment verwendet.

In der Dokumentation steht:

%Vor%

Sie können diesen Fehler beheben, indem Sie diese Methode in Activity / FragmentActivity überschreiben:

%Vor%

Wenn Sie faul sind und nur testen möchten, ob dieser Fix funktioniert, bevor Sie alle Ihre Fragmente in diese Methode codieren, können Sie einfach true ohne Überprüfung zurückgeben:

%Vor%

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

    
Camille Sévigny 29.03.2014 23:56
quelle
5

Hier gehen Sie!

Schlag hier rein, und du bist gut!

Sammeln Sie alle inneren Klassen, die in dieser Präferenz-Aktivität gefunden werden. Ich entschied mich, die Liste in eine statische Feldvariable zu setzen:

%Vor%

Überschreiben Sie dann die Methode, ValidFragment, und stellen Sie sicher, dass das Fragment, das angezeigt werden soll, eines ist, das der übergeordneten Aktivität bekannt ist:

%Vor%     
Drawn 15.03.2015 00:14
quelle