web-dev-qa-db-fra.com

setBackground vs setBackgroundDrawable (Android)

Je veux mettre en arrière-plan dessinable d'une vue. Il existe deux méthodes pour cela (autant que je sache): setBackground et setBackgroundDrawable

Lorsque j'utilise setBackground, il est indiqué qu'il a été ajouté dans API de niveau 16 , mais que la version minimale du kit SDK de mon projet est 7. J'imagine que cela ne fonctionnera pas si la valeur est inférieure à 16, n'est-ce pas? Mais lorsque j'utilise setBackgroundDrawable, il est obsolète.

Qu'est-ce que je suis supposé utiliser?

246
Pijusn

Il est déconseillé, mais cela fonctionne toujours, vous pouvez donc l'utiliser. Mais si vous voulez être complètement correct, juste pour l'exhaustivité ... 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.

396
Warpzit

Vous pouvez utiliser setBackgroundResource() à la place de l'API de niveau 1.

107
Ludovic

semble qu'il n'y a actuellement aucune différence entre les 2 fonctions, comme indiqué sur le code source (crédit de ce post :

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

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

il s’agit donc simplement d’une décision de nommage, similaire à celle avec parent de remplissage vs parent de correspondance.

55
android developer

je sais que c’est une vieille question, mais j’ai une situation similaire, et ma solution a été

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

et puis vous pouvez jouer avec le "Drawable", appliquer des filtres de couleur, etc.

18
Jose De Gouveia

Utilisez ViewCompat.setBackground(view, background);

13
krawa

vous pouvez utiliser setBackgroundResource() à la place, c'est-à-dire relativeLayout.setBackgroundResource(R.drawable.back);

cela fonctionne pour moi.

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 HEX , comme ceci:

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

A ressource de couleur , comme ceci:

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

Ou une ressource XML personnalisée , comme ceci:

myView.setBackgroundResource(R.drawable.my_custom_background);

J'espère que ça aide!

6
Geraldo Neto

En utilisant Android studio 1.5.1, j'ai les avertissements suivants:

Call requires API level 16 (current min is 9): Android.view.View#setBackground

et les plaintes concernant 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
Aksel Willgert

Utilisez setBackgroundResource (R.drawable.xml/png)

0
baburaoS

Cela fonctionne pour moi:Voir la vueest votre editText, spinner ... etc. Etint drawableest votre exemple d'itinéraire tracé (R.drawable.yourDrawable)

 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
user0987