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?

242
demandé sur Willi Mentzel 2012-08-14 11:24:38

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.

394
répondu Warpzit 2013-03-21 12:25:50

vous pouvez utiliser setBackgroundResource() à la place qui est dans le niveau API 1.

105
répondu Ludovic 2013-06-24 22:55:06

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 .

53
répondu android developer 2017-05-23 10:31:32

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

18
répondu Jose De Gouveia 2013-03-29 23:20:43

Utiliser ViewCompat.setBackground(view, background);

12
répondu krawa 2016-12-12 10:36:53

vous pouvez utiliser setBackgroundResource() à la place de relativeLayout.setBackgroundResource(R.drawable.back);

ça me va.

11
répondu Emmanuel Francis Narvasa Ramos 2015-04-24 11:10:27

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);
    }
6
répondu Aksel Willgert 2016-01-22 09:10:42

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!

5
répondu Geraldo Neto 2016-04-11 16:03:12

utiliser setBackgroundResource (R. drawable.xml / png)

0
répondu baburaoS 2017-03-01 19:56:26

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));
        }    
    }
0
répondu user0987 2017-09-29 20:06:07

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.

-2
répondu Jens-Joris Decorte 2014-08-02 11:49:01

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

-4
répondu Fabricio 2014-03-27 10:50:36