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?
Resources#getDrawable(int)
und Resources#getColor(int)
veraltet waren.
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?
Resources#getDrawable(int)
und Resources#getColor(int)
veraltet waren.
Antworten:
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);
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)
.
getDrawable (int id)
Methode der Context
Klasse bezieht . Dies entspricht getResources().getDrawable(id, getTheme());
der neuen API und verwendet diese auch.
getDrawable(int, Resources.Theme)
.
Ersetzen Sie diese Zeile:
getResources().getDrawable(R.drawable.your_drawable)
mit ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
BEARBEITEN
ResourcesCompat
ist jetzt auch veraltet. Aber Sie können dies verwenden:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Hier this
ist der Kontext)
Für weitere Details folgen Sie diesem Link: ContextCompat
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));
}
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. :)"
Sie können verwenden
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
Das ist Arbeit für mich
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)));
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));
}
}
Wenn Sie auf SDK> 21 (Lollipop oder 5.0) abzielen, verwenden Sie
context.getDrawable(R.drawable.your_drawable_name)
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.
en api level 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
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)
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.
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)
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);
}
BuildVersionCodes
eine Klasse nicht spezifisch für Xamarin?
getDrawable (int id)
der KlasseResources
veraltet ist. Sie sollten die Methode jetztgetDrawable (int id, Resources.Theme theme)
mit dem neuen Designparameter verwenden.