web-dev-qa-db-fra.com

Android getResources (). GetDrawable () API déconseillée 22

Avec la nouvelle Android API 22 getResources().getDrawable() est maintenant obsolète. Maintenant, la meilleure approche consiste à utiliser uniquement getDrawable().

Qu'est ce qui a changé?

650
Blodhgard

Vous avez quelques options pour gérer cette dépréciation de la bonne manière (et preuve future), selon le type de dessinable que vous chargez:


A) drawables avec attributs de thème

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

Vous obtiendrez un dessin comme indiqué par votre thème d'activité. C'est probablement ce dont vous avez besoin.


B) drawables sans attributs de thème

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

Vous obtiendrez votre dessin sans style à l'ancienne. Remarque: ResourcesCompat.getDrawable() est not obsolète!


EXTRA) drawables avec attributs de thème de autre thème

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
931
araks

Edit: voir mon blog sur le sujet pour une explication plus complète


Vous devez plutôt utiliser le code suivant de la bibliothèque de support:

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

Utiliser cette méthode revient à appeler:

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

À partir de l'API 21, vous devez utiliser la méthode getDrawable(int, Theme) à la place de getDrawable(int), car elle vous permet d'extraire un objet pouvant être dessiné associé à un ID de ressource particulier pour la densité d'écran/le thème donné. Appeler la méthode obsolète getDrawable(int) équivaut à appeler getDrawable(int, null).

734
Alex Lockwood

Remplacez cette ligne: getResources().getDrawable(R.drawable.your_drawable)

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

MODIFIER

ResourcesCompat est également obsolète maintenant. Mais vous pouvez utiliser ceci:

ContextCompat.getDrawable(this, R.drawable.your_drawable) (Ici this est le contexte)

pour plus de détails suivez ce lien: ContextCompat

140
vincent091

getResources().getDrawable() était obsolète dans l'API de niveau 22. Nous devons maintenant ajouter le thème:

getDrawable (int id, thème Resources.Theme) (ajouté au niveau 21 de l'API)

Ceci est un exemple:

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

Voici un exemple de validation pour les versions ultérieures:

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

Vous pouvez utiliser

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

ça marche pour moi

2
Dasser Basyouni

Essaye ça:

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));
    }
}
1
syakirin mohd nor

Juste un exemple de la façon dont j'ai résolu le problème dans un tableau pour charger un listView, j'espère que cela aidera.

 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
Jay

Maintenant, vous devez implémenter comme ceci

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

Suite à une seule ligne de code suffit, tout sera pris en charge par ContextCompat.getDrawable

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

Build.VERSION_CODES.Lollipop doit maintenant être remplacé par BuildVersionCodes.Lollipop i.e:

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);
}
0
Ryan Herman

Si vous ciblez un SDK> 21 (Lollipop ou 5.0), utilisez

context.getDrawable(R.drawable.your_drawable_name)

Voir la documentation

0
Adeel Ahmad

en api niveau 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
0
Jaime López Romero