257 votes

setBackground vs setBackgroundDrawable (Android)

Je veux définir l'arrière-plan drawable d'une vue. Il y a deux méthodes pour cela (pour autant que je vois): setBackground et setBackgroundDrawable. Quand j'utilise setBackground, il est dit qu'il a été ajouté au niveau 16 de l'API, mais la version min SDK de mon projet est 7. Je suppose que ça ne marchera pas sur n'importe quoi en dessous de 16, n'est-ce pas? Mais quand j'utilise setBackgroundDrawable, il est dit qu'il est déprécié.

Que suis-je censé utiliser?

403voto

Warpzit Points 11150

C'est obsolète mais ça marche toujours, donc vous pouvez juste l'utiliser. Mais si vous voulez être complètement correct, juste pour l'exhaustivité de celui-ci ... Vous feriez quelque chose comme suit:

 int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}
 

Pour que cela fonctionne, vous devez définir buildTarget api 16 et min build à 7 ou quelque chose de similaire.

111voto

Ludovic Points 659

Vous pouvez utiliser setBackgroundResource() place qui est au niveau de l'API 1.

55voto

android developer Points 20939

semble qu'actuellement il n'y a pas de différence entre les 2 fonctions, comme le montre le code source (mention de ce post) :

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

donc c'est juste une appellation décision, semblable à celui avec remplissage-parent vs match-parent .

18voto

Joyal Points 370

Je sais que c'est une vieille question mais j'ai une situation similaire, et ma solution était

 button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();
 

et puis vous pouvez jouer avec le "Drawable", en appliquant des filtres de couleur, etc

-4voto

Fabricio Points 43

Vous pouvez aussi faire ceci:

 try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}
 

EDIT: Juste comme indiqué par @BlazejCzapp il est préférable d'éviter d'utiliser la réflexion si vous parvenez à résoudre le problème sans cela. J'ai eu un cas d'utilisation où j'étais incapable de résoudre sans réfléchir mais ce n'est pas le cas ci-dessus. Pour plus d'informations, veuillez consulter http://docs.oracle.com/javase/tutorial/reflect/index.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X