setBackground vs setBackgroundDrawable (Android))
je veux mettre le dessin de fond d'une vue. Il y a deux méthodes pour cela (pour autant que je vois): setBackground
et setBackgroundDrawable
.
quand j'utilise setBackground
, il dit qu'il a été ajouté dans niveau API 16 mais la version min SDK de mon projet est 7. Je suppose que ça ne marchera pas en dessous de 16 ans, n'est-ce pas? Mais quand j'utilise setBackgroundDrawable, ça dit que c'est déprécié.
Qu'est-ce que je suis censé utiliser?
12 réponses
il est déprécié mais il fonctionne toujours de sorte que vous pouvez juste l'utiliser. Mais si vous voulez être complètement correct, juste pour l'exhaustivité... Vous feriez quelque chose comme ceci:
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 l'api buildTarget 16 Et min build à 7 ou quelque chose de similaire.
vous pouvez utiliser setBackgroundResource()
à la place qui est dans le niveau API 1.
semble qu'il n'y a actuellement aucune différence entre les 2 fonctions, comme indiqué sur le code source (crédit à ce poste ) :
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 .
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", l'application de filtres couleur, etc
vous pouvez utiliser setBackgroundResource()
à la place de relativeLayout.setBackgroundResource(R.drawable.back);
ça me va.
sur Android studio 1.5.1 j'ai reçu les avertissements suivants:
Call requires API level 16 (current min is 9): android.view.View#setBackground
et les plaintes au sujet de la dépréciation
'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated
en utilisant ce format, je me suis débarrassé des deux:
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
//noinspection deprecation
layout.setBackgroundDrawable(drawable);
} else {
layout.setBackground(drawable);
}
Maintenant vous pouvez utiliser l'une ou l'autre de ces options. Et ça va marcher dans tous les cas. Votre couleur peut être un code hexadécimal , comme ceci:
myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));
Un la couleur des ressources , comme ceci:
myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));
Ou un xml personnalisé de ressources , comme suit:
myView.setBackgroundResource(R.drawable.my_custom_background);
Espère que cela aide!
cela fonctionne pour moi: View view est votre texte d'édition, spinner...etc. Et int drawable est votre exemple de route drawable (R. drawable.votre drawable)
public void verifyDrawable (View view, int drawable){
int sdk = Build.VERSION.SDK_INT;
if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
view.setBackgroundDrawable(
ContextCompat.getDrawable(getContext(),drawable));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(getResources().getDrawable(drawable));
}
}
j'ai aussi eu ce problème, mais j'ai fait un contournement en utilisant un ImageView .
essayez d'utiliser un RelativeLayout et ajoutez un ImageView à l'intérieur (width and height: fill_parent, scaleType: center).
assurez-vous également que l'imageview est le premier élément à L'intérieur de L'affichage relatif, de sorte qu'il agira comme arrière-plan.
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: tout comme souligné par @BlazejCzapp il est préférable d'éviter d'utiliser la réflexion si vous pouvez réussir à résoudre le problème sans elle. J'ai eu un cas d'utilisation où j'ai été incapable de résoudre sans réflexion, mais qui n'est pas le cas ci-dessus. Pour plus d'informations s'il vous plaît jeter un oeil à http://docs.oracle.com/javase/tutorial/reflect/index.html