Ich bin ein wenig verwirrt mit diesen beiden APIs.
ResourcesCompat.getDrawable (Ressourcen res, int id, Resources.Theme-Thema)
Gibt ein Zeichenobjekt zurück, das einer bestimmten Ressourcen-ID zugeordnet ist und für das angegebene Thema formatiert ist. Abhängig von der zugrunde liegenden Ressource werden verschiedene Arten von Objekten zurückgegeben - z. B. eine Farbe, ein PNG-Bild, ein skalierbares Bild usw.
Vor der API-Stufe 21 wird das Design nicht angewendet und diese Methode ruft einfach getDrawable (int) auf.
AppCompatResources.getDrawable (Kontextkontext, int resId)
Gibt ein Zeichenobjekt zurück, das einer bestimmten Ressourcen-ID zugeordnet ist.
Diese Methode unterstützt das Aufpumpen von Vektor und animierten Vektorressourcen auf Geräten, auf denen keine Plattformunterstützung verfügbar ist.
Wenn man sich den Quellcode der beiden Methoden ansieht, scheinen sie sich sehr ähnlich zu sein. Wenn du keine Vektoren hast, könntest du wahrscheinlich mit dem einen oder dem anderen davonkommen.
ResourceCompat.getDrawable () ruft Resources#getDrawable(int, theme)
für APIs 21 oder höher auf. Es unterstützt auch Android APIs 4+. Es ist nicht mehr als das:
Where-in ResourcesCompatApi21
ruft lediglich res.getDrawable(id, theme)
auf. Dies bedeutet, dass nicht das Zeichnen von Vektorzeichen zulassen soll, wenn das Gerät Vektorzeichen nicht unterstützt. Sie können jedoch ein Thema übergeben.
Inzwischen ändert sich der Code für AppCompatResources .getDrawable (Kontextkontext, int resId) landet schließlich auf diesem:
%Vor% Also wird diese Instanz versuchen, die Ressource zu zeichnen, wenn es möglich ist, andernfalls sucht sie in der ContextCompat
Version nach der Ressource. Dann wird es sogar getönt, wenn es nötig ist. Diese Methode unterstützt jedoch nur API 7 +.
Ich denke also, zu entscheiden, ob Sie beide verwenden sollten,
Müssen Sie API 4, 5 oder 6 unterstützen?
ResourcesCompat
oder ContextCompat
zu verwenden. Müssen Sie unbedingt ein benutzerdefiniertes Theme bereitstellen?
ResourcesCompat
zu verwenden
AppCompatResources
ResourcesCompat
, ContextCompat
und so ziemlich jede Klasse von support-v4, die mit Compat
endet, erspart Ihnen das Schreiben von if (Build.VERSION.SDK_INT >= X)
checks überall. Das ist es. Zum Beispiel statt
Sie können
schreiben %Vor%Es gelten die in Kommentaren beschriebenen Grenzen, zB
%Vor%wendet die Designattribute vor Lollipop nicht an (dies wird in der Dokumentation gesagt). Aber Sie müssen nicht schreiben, wenn Schecks und Ihr Code auf alten Geräten nicht abstürzt, weil Sie dort keine neuen APIs verwenden.
AppCompatResources
wird Ihnen auf der anderen Seite helfen, neue Funktionen auf alte Plattformen zu bringen (Support-Vektoren, Themenreferenzen in Farbzustandslisten).
Welche sollte ich einer anderen bevorzugen und warum?
Verwenden Sie AppCompatResources
, um konsistente Ergebnisse mit dem Rest der appcompat-v7-Bibliothek zu erhalten. Sie erhalten:
getColorStateList
, die Farben mit Themenattributverweisen auflösen kann (z. B. android:alpha="?android:disabledAlpha"
), getDrawable
, das das Aufblasen von Vektoren auf allen Plattformen unterstützt, und diese Vektor-Zeichenvorlagen verstehen auch Themenattributverweise (z. B. android:tint="?colorControlNormal"
), ContextCompat
zurück. Hier ist mein Verständnis nach einem Test
%Vor% Als Erstes sehen Sie VectorDrawableCompat
und ResourcesCompat
kann ein bestimmtes Thema
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
in onCreated
der Anwendungsklasse
1) Für ein Vektorbild
API & gt; = 21
ContextCompat
funktioniert gut ResourcesCompat
funktioniert gut AppCompatResources
funktioniert gut VectorDrawableCompat
funktioniert gut API & lt; 21
ContextCompat
Absturz
ResourcesCompat
Absturz
AppCompatResources
funktioniert gut VectorDrawableCompat
funktioniert gut 2) Für normales Bild
ContextCompat
funktioniert gut ResourcesCompat
funktioniert gut AppCompatResources
funktioniert gut VectorDrawableCompat
Absturz
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
in onCreated
der Anwendungsklasse
1) Für ein Vektorbild
ContextCompat
funktioniert gut ResourcesCompat
funktioniert gut AppCompatResources
funktioniert gut VectorDrawableCompat
funktioniert gut 2) Für normales Bild
ContextCompat
funktioniert gut ResourcesCompat
funktioniert gut AppCompatResources
funktioniert gut VectorDrawableCompat
Absturz
Tags und Links java android android-resources android-theme android-styles