ResourcesCompat.getDrawable () und AppCompatResources.getDrawable ()

10

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.

Frage

  1. Was ist der wesentliche Unterschied zwischen diesen beiden Klassen? (außer Vektor Inflation)?
  2. Welchen sollte ich einem anderen vorziehen und warum?
azizbekian 24.03.2017, 16:42
quelle

3 Antworten

13

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:

%Vor%

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,

  1. Müssen Sie API 4, 5 oder 6 unterstützen?

    • Ja: Keine andere Wahl, als ResourcesCompat oder ContextCompat zu verwenden.
    • Nein: Weiter zu # 2.
  2. Müssen Sie unbedingt ein benutzerdefiniertes Theme bereitstellen?

    • Ja: Keine andere Wahl, als ResourcesCompat zu verwenden
    • Nein: Verwenden Sie AppCompatResources
DeeV 24.03.2017, 17:09
quelle
6

ContextCompat

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

%Vor%

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

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" ),
  • appcompat-v7 Zeichen und Farben wie Häkchen oder Optionsfelder haben die richtigen Farben, die durch das mitgelieferte Kontext-Thema
  • definiert sind
  • Wenn das obige nicht zutrifft, fällt es trotzdem auf ContextCompat zurück.
Eugen Pechanec 24.03.2017 18:35
quelle
1

Hier ist mein Verständnis nach einem Test

%Vor%

Als Erstes sehen Sie VectorDrawableCompat und ResourcesCompat kann ein bestimmtes Thema

I) Ohne Verwendung von

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

  • Auf allen Ebenen
    • ContextCompat funktioniert gut
    • ResourcesCompat funktioniert gut
    • AppCompatResources funktioniert gut
    • VectorDrawableCompat Absturz

II) Verwenden von

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); in onCreated der Anwendungsklasse

1) Für ein Vektorbild

  • Auf allen Ebenen
    • ContextCompat funktioniert gut
    • ResourcesCompat funktioniert gut
    • AppCompatResources funktioniert gut
    • VectorDrawableCompat funktioniert gut

2) Für normales Bild

  • Auf allen Ebenen
    • ContextCompat funktioniert gut
    • ResourcesCompat funktioniert gut
    • AppCompatResources funktioniert gut
    • VectorDrawableCompat Absturz
Phan Van Linh 13.01.2018 04:59
quelle