Android getResources (). GetDrawable () API 22 obsoleta


699

Con la nuova API 22 di Android getResources().getDrawable()è ora obsoleto. Adesso l'approccio migliore è usare sologetDrawable() .

Che cosa è cambiato?


Potresti specificare la tua domanda? È giusto che il metodo getDrawable (int id)della classe Resourcessia deprecato. Ora dovresti usare il metodo getDrawable (int id, Resources.Theme theme)con il nuovo parametro del tema.
codice scimmia

1
ContextCompat.getDrawable (context, R.color.color_name)
Ashokchakravarthi Nagarajan

Puoi consultare il mio post sul blog su questo argomento per una spiegazione più approfondita del perché entrambi Resources#getDrawable(int)e Resources#getColor(int)sono stati deprecati.
Alex Lockwood,

1
Google dovrebbe mettere soluzioni rapide per ogni funzione deprecata. Ho pubblicato un post al riguardo qui: code.google.com/p/android/issues/detail?id=219495
sviluppatore Android

Risposte:


1027

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);

La mia app si arresta in modo anomalo utilizzando il suggerimento B. Non gli piace la chiamata Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null);
FractalBob,

Lo dichiaro in questo modo: vuoto statico pubblico setImageButtonEnabled (contesto ctxt, booleano abilitato, elemento ImageButton, int iconResId) {item.setEnabled (abilitato); Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null); Icona estraibile = abilitata? originalIcon: convertDrawableToGrayScale (originalIcon); item.setImageDrawable (icona); } e chiamalo così: Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
FractalBob,

Più precisamente, sembra che l'incidente stia accadendo perché la mia icona è un disegno vettoriale.
FractalBob,

1
versione xamarin: ResourcesCompat.GetDrawable (Resources, Resource.Drawable.name, null);
Brian,

Ti aggiungo un'altra parola , ContextCompat.getColor (contesto, colore) può anche aiutarti ...
BertKing

746

Modifica: vedi il mio post sul blog sull'argomento per una spiegazione più completa


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).


8
Penso che l'OP si riferisca anche al getDrawable (int id)metodo della Contextclasse. È uguale getResources().getDrawable(id, getTheme());e utilizza anche la nuova API.
codice scimmia

9
Secondo la documentazione, è richiesto un livello minimo di API 21 per l'uso getDrawable(int, Resources.Theme).
Prince,

@Prince Il metodo è stato aggiunto nell'API 21 ma non è stato deprecato fino all'API 22. :)
Alex Lockwood,

Il documento Android consiglia inoltre di utilizzare il metodo Context :: getDrawable (int) ma poiché è stato introdotto solo nell'API 21 sembra che ContextCompat sia la scelta migliore.
goRGon

Questa risposta non funziona con i file .svg, nelle versioni precedenti all'API 21. C'è un bug nella libreria.
Jorge Rodríguez,

141

Sostituisci questa riga: getResources().getDrawable(R.drawable.your_drawable)

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

MODIFICARE

ResourcesCompatora è anche deprecato. Ma puoi usare questo:

ContextCompat.getDrawable(this, R.drawable.your_drawable) (Qui this il contesto)

per maggiori dettagli segui questo link: ContextCompat


2
Questo è deprecato
Xyaren


2
Non dice nel link che ResourcesCompatè deprecato. Dovrebbe funzionare bene.
Jacob R,

cosa scrivere in "il tuo disegno" se voglio inserire immagini in una vista elenco facendo clic sugli elementi dell'elenco memorizzati in
disegno

29

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. :)"
Mark Cramer,

2

Puoi usare

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

questo è lavoro per me


Utilizzo del contesto dell'applicazione per caricare arresti anomali disegnabili su pre-lecca-lecca. Qualche correzione per questo?
muthuraj,

1
@muthuraj Non ricordo i miei test per il codice con case lollipop, ma puoi provare getActivity () o getResources () invece, va bene con il tuo codice?
Dasser Basyouni,

Sto usando il modello MVVM e ho bisogno di gonfiare i drawable all'interno di ViewModels che non hanno un contesto di attività. Ha solo un contesto applicativo. Questo è il mio problema.
muthuraj,

1

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)));

1

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));
    }
}

Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
Paperino


1

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.


Vale la pena ricordare che getDrawable (DrawableRes int id, Theme theme) può generare un'eccezione se la risorsa non viene trovata mentre getDrawable (Context context, int id) è nullable, quindi deve essere restituito con Drawable? a Kotlin.
Pitos,

0

api livello 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));

Dovresti fornire un po 'più contesto attorno alla tua risposta.
Nicolas Grenié,

0

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)

0

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


0

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)

-2

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);
}

BuildVersionCodesUna classe non è specifica per Xamarin?
Ted Hopp,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.