Android getResources (). GetDrawable () veraltete API 22

699

Mit der neuen Android API ist 22 getResources().getDrawable()jetzt veraltet. Jetzt ist der beste Ansatz, nur zu verwenden getDrawable().

Was hat sich geändert?

Blodhgard
quelle
Könnten Sie Ihre Frage angeben? Es ist richtig, dass die Methode getDrawable (int id)der Klasse Resourcesveraltet ist. Sie sollten die Methode jetzt getDrawable (int id, Resources.Theme theme)mit dem neuen Designparameter verwenden.
Code Affe
1
ContextCompat.getDrawable (Kontext, R.color.color_name)
Ashokchakravarthi Nagarajan
In meinem Blogbeitrag zu diesem Thema finden Sie eine ausführlichere Erklärung, warum beide Resources#getDrawable(int)und Resources#getColor(int)veraltet waren.
Alex Lockwood
1
Google sollte für jede veraltete Funktion Schnellkorrekturen vornehmen. Ich habe hier einen Beitrag darüber geschrieben: code.google.com/p/android/issues/detail?id=219495
Android-Entwickler

Antworten:

1027

Sie haben einige Optionen, um mit dieser Abwertung richtig (und zukunftssicher ) umzugehen, je nachdem, welche Art von Zeichen Sie laden:


A) Drawables mit Thema Attributen

ContextCompat.getDrawable(getActivity(), R.drawable.name);

Sie erhalten ein gestaltetes Drawable, wie es in Ihrem Aktivitätsthema angegeben ist. Dies ist wahrscheinlich das, was Sie brauchen.


B) Drawables ohne Thema Attribute

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Sie erhalten Ihr ungestyltes Zeichen auf die alte Art und Weise. Bitte beachten Sie: ResourcesCompat.getDrawable()ist nicht veraltet!


EXTRA) Drawables mit Themenattributen aus einem anderen Thema

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Araks
quelle
Meine App stürzt mit Vorschlag B ab. Der Aufruf Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null) gefällt ihr nicht.
FractalBob
Ich deklariere es so: public static void setImageButtonEnabled (Kontext ctxt, Boolescher Wert aktiviert, ImageButton-Element, int iconResId) {item.setEnabled (aktiviert); Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null); Zeichenbares Symbol = aktiviert? originalIcon: convertDrawableToGrayScale (originalIcon); item.setImageDrawable (Symbol); } und nenne es so: Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
FractalBob
Genauer gesagt scheint der Absturz zu geschehen, da mein Symbol ein Vektor ist, der gezeichnet werden kann.
FractalBob
1
xamarin-Version: ResourcesCompat.GetDrawable (Resources, Resource.Drawable.name, null);
Brian
Ich füge dir noch ein Wort hinzu , ContextCompat.getColor (Kontext, Farbe) kann dir auch helfen ...
BertKing
746

Bearbeiten: Eine ausführlichere Erklärung finden Sie in meinem Blogbeitrag zu diesem Thema


Sie sollten stattdessen den folgenden Code aus der Support-Bibliothek verwenden:

ContextCompat.getDrawable(context, R.drawable.***)

Die Verwendung dieser Methode entspricht dem Aufruf von:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

Ab API 21 sollten Sie die getDrawable(int, Theme)Methode anstelle von verwenden getDrawable(int), da Sie damit ein zeichnbares Objekt abrufen können, das einer bestimmten Ressourcen-ID für die angegebene Bildschirmdichte / das angegebene Thema zugeordnet ist. Das Aufrufen der veralteten getDrawable(int)Methode entspricht dem Aufrufen getDrawable(int, null).

Alex Lockwood
quelle
8
Ich denke, dass sich das OP auch auf die getDrawable (int id)Methode der ContextKlasse bezieht . Dies entspricht getResources().getDrawable(id, getTheme());der neuen API und verwendet diese auch.
Code Affe
9
Laut Dokumentation ist für die Verwendung mindestens API Level 21 erforderlich getDrawable(int, Resources.Theme).
Prinz
@ Prince Die Methode wurde in API 21 hinzugefügt, aber es wurde nicht bis API 22 veraltet. :)
Alex Lockwood
Android doc empfiehlt auch die Verwendung der Context :: getDrawable (int) -Methode. Da sie jedoch nur in API 21 eingeführt wurde, scheint ContextCompat die beste Wahl zu sein.
GoRGon
Diese Antwort funktioniert nicht mit .svg-Dateien in Versionen, die älter als API 21 sind. Es gibt einen Fehler in der Bibliothek.
Jorge Rodríguez
141

Ersetzen Sie diese Zeile: getResources().getDrawable(R.drawable.your_drawable)

mit ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

BEARBEITEN

ResourcesCompatist jetzt auch veraltet. Aber Sie können dies verwenden:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(Hier thisist der Kontext)

Für weitere Details folgen Sie diesem Link: ContextCompat

vincent091
quelle
2
Das ist jetzt auch beraubt
Xyaren
siehe diesen Link bitte: developer.android.com/reference/android/support/v4/content/… , int)
vincent091
2
In dem Link heißt es nicht, dass er ResourcesCompatveraltet ist. Es sollte gut funktionieren.
Jacob R
Was soll ich in "your drawable" schreiben, wenn ich Bilder in eine Listenansicht eingeben möchte, wenn ich auf Listenelemente klicke, die in drawable gespeichert sind
0x0001
29

getResources().getDrawable() wurde in API Level 22 veraltet. Jetzt müssen wir das Thema hinzufügen:

getDrawable (int id, Resources.Theme-Thema) (Hinzugefügt in API-Level 21)

Dies ist ein Beispiel:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

Dies ist ein Beispiel für die Validierung für spätere Versionen:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}
Jorgesys
quelle
Build.VERSION_CODES.LOLLIPOP is API 21, sollte das nicht sein if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)oder if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? Keine Ursache. Von unten "Die Methode wurde in API 21 hinzugefügt, aber erst in API 22 veraltet. :)"
Mark Cramer
2

Sie können verwenden

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

Das ist Arbeit für mich

Dasser Basyouni
quelle
Verwenden des Anwendungskontexts zum Laden von Vektor-Drawable-Abstürzen auf Pre-Lollipop. Irgendeine Lösung dafür?
Muthuraj
1
@muthuraj Ich erinnere mich nicht an meine Tests für den Code mit Lollipop-Fall, aber Sie können stattdessen getActivity () oder getResources () ausprobieren. Passt das gut zu Ihrem Code?
Dasser Basyouni
Ich verwende das MVVM-Muster und muss Drawables in ViewModels aufblasen, die keinen Aktivitätskontext haben. Es hat nur Anwendungskontext. Das ist mein Problem.
Muthuraj
1

Nur ein Beispiel dafür, wie ich das Problem in einem Array behoben habe, um eine listView zu laden. Ich hoffe, es hilft.

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));
Jay
quelle
1

Versuche dies:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}
Syakirin Mohd noch
quelle
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Donald Duck
1

Wenn Sie auf SDK> 21 (Lollipop oder 5.0) abzielen, verwenden Sie

context.getDrawable(R.drawable.your_drawable_name)

Siehe Dokumente

Adeel Ahmad
quelle
1

getDrawable (int drawable) ist in API-Level 22 veraltet. Eine Referenz finden Sie unter diesem Link .

Um dieses Problem zu lösen, müssen wir einen neuen Konstruktor mit einer ID wie folgt übergeben: -

getDrawable(int id, Resources.Theme theme)

Für Lösungen Gehen Sie wie folgt vor: -

In Java: -

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

oder

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

In Kotlin: -

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

oder

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

Hoffe das wird dir helfen. Danke.

Rahul Kushwaha
quelle
Es ist erwähnenswert, dass getDrawable (DrawableRes int id, Theme theme) eine Ausnahme auslösen kann, wenn die Ressource nicht gefunden wird, während getDrawable (Kontextkontext, int id) nullbar ist und daher mit Drawable zurückgegeben werden muss. in Kotlin.
Pitos
0

en api level 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Jaime López Romero
quelle
Sie sollten etwas mehr Kontext für Ihre Antwort bereitstellen.
Nicolas Grenié
0

Jetzt müssen Sie so implementieren

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

Das Befolgen einer einzigen Codezeile reicht aus, ContextCompat.getDrawable kümmert sich um alles

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)
Farid Haq
quelle
0

Für einige, die dieses Problem auch nach dem Anwenden des Vorschlags dieses Threads noch lösen müssen (ich war früher einer davon), fügen Sie diese Zeile in Ihre Anwendungsklasse ein, onCreate () -Methode

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

Wie hier und hier vorgeschlagen, ist dies manchmal erforderlich, um auf Vektoren aus Ressourcen zuzugreifen, insbesondere wenn Sie mit Menüelementen usw.

Stamatis Stiliats
quelle
0

In Kotlin können Sie die Erweiterung verwenden

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

dann benutze wie

context.getMyDrawable(R.drawable.my_icon)
Deepak Kanyan
quelle
-2

Build.VERSION_CODES.LOLLIPOP sollte jetzt in BuildVersionCodes.Lollipop geändert werden, dh:

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}
Ryan Herman
quelle
Ist BuildVersionCodeseine Klasse nicht spezifisch für Xamarin?
Ted Hopp