Con la nuova API 22 di Android getResources().getDrawable()
è ora obsoleto. Adesso l'approccio migliore è usare sologetDrawable()
.
Che cosa è cambiato?
Resources#getDrawable(int)
e Resources#getColor(int)
sono stati deprecati.
Con la nuova API 22 di Android getResources().getDrawable()
è ora obsoleto. Adesso l'approccio migliore è usare sologetDrawable()
.
Che cosa è cambiato?
Resources#getDrawable(int)
e Resources#getColor(int)
sono stati deprecati.
Risposte:
Hai alcune opzioni per gestire questa deprecazione nel modo giusto (e futuro ), a seconda del tipo di disegno che stai caricando:
A) drawable con attributi del tema
ContextCompat.getDrawable(getActivity(), R.drawable.name);
Otterrai un Drawable in stile secondo le istruzioni del tema Attività. Questo è probabilmente quello che ti serve.
B) drawable senza attributi del tema
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
Otterrai il tuo disegnabile senza stile alla vecchia maniera. Nota: nonResourcesCompat.getDrawable()
è obsoleto!
EXTRA) disegnabili con attributi di temi di un altro tema
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Dovresti invece usare il seguente codice dalla libreria di supporto:
ContextCompat.getDrawable(context, R.drawable.***)
L'uso di questo metodo equivale a chiamare:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
A partire da API 21, dovresti usare il getDrawable(int, Theme)
metodo anziché getDrawable(int)
, poiché consente di recuperare un oggetto disegnabile associato a un determinato ID risorsa per la densità / il tema dello schermo specificati. Chiamare il getDrawable(int)
metodo obsoleto equivale a chiamare getDrawable(int, null)
.
getDrawable (int id)
metodo della Context
classe. È uguale getResources().getDrawable(id, getTheme());
e utilizza anche la nuova API.
getDrawable(int, Resources.Theme)
.
Sostituisci questa riga:
getResources().getDrawable(R.drawable.your_drawable)
con ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
MODIFICARE
ResourcesCompat
ora è anche deprecato. Ma puoi usare questo:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Qui this
il contesto)
per maggiori dettagli segui questo link: ContextCompat
getResources().getDrawable()
è stato deprecato nel livello API 22. Ora dobbiamo aggiungere il tema:getDrawable (int id, tema Resources.Theme) (aggiunto nel livello API 21)
Questo è un esempio:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
Questo è un esempio di come convalidare per le versioni successive:
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
, quindi non dovrebbe essere if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
o if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? Non importa. Da sotto "Il metodo è stato aggiunto nell'API 21 ma non è stato deprecato fino all'API 22. :)"
Puoi usare
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
questo è lavoro per me
Solo un esempio di come ho risolto il problema in un array per caricare un listView, spero che sia d'aiuto.
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)));
Prova questo:
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));
}
}
Se scegli come target SDK> 21 (lollipop o 5.0), utilizza
context.getDrawable(R.drawable.your_drawable_name)
getDrawable (int drawable) è deprecato nel livello API 22. Per riferimento vedi questo link .
Ora per risolvere questo problema dobbiamo passare un nuovo costruttore insieme a id come: -
getDrawable(int id, Resources.Theme theme)
Per soluzioni Fare così: -
In Java: -
ContextCompat.getDrawable(getActivity(), R.drawable.name);
o
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
A Kotlin: -
rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)
o
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
Spero che questo ti possa aiutare. Grazie.
api livello 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Ora devi implementare in questo modo
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
//
} else {
//
}
Seguire una sola riga di codice è sufficiente, tutto si occuperà di ContextCompat.getDrawable
ContextCompat.getDrawable(this, R.drawable.your_drawable_file)
Per alcuni che hanno ancora questo problema da risolvere anche dopo aver applicato il suggerimento di questo thread (ero uno del genere) aggiungi questa riga alla tua classe Application, metodo onCreate ()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
Come suggerito qui e qui a volte questo è necessario per accedere ai vettori dalle risorse, specialmente quando si ha a che fare con voci di menu, ecc
In Kotlin puoi usare l'estensione
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
quindi usa come
context.getMyDrawable(R.drawable.my_icon)
Build.VERSION_CODES.LOLLIPOP ora dovrebbe essere modificato in BuildVersionCodes.Lollipop, ovvero:
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
Una classe non è specifica per Xamarin?
getDrawable (int id)
della classeResources
sia deprecato. Ora dovresti usare il metodogetDrawable (int id, Resources.Theme theme)
con il nuovo parametro del tema.