Comment définir l'arrière-plan dessinable par programme dans Android

289

Pour définir l'arrière-plan:

RelativeLayout layout =(RelativeLayout)findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.ready);

Est-ce la meilleure façon de le faire?

Chad Bingham
la source
2
Je vous remercie! votre question et toutes les réponses utiles m'ont aidé à définir la ressource d'arrière-plan d'un bouton d'image dans un widget . voici un exemple de code au cas où quelqu'un serait intéressé:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam
1
Solution Kotlin pour qui peut avoir besoin: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Réponses:

490

layout.setBackgroundResource(R.drawable.ready);est correct.
Une autre façon d'y parvenir est d'utiliser les éléments suivants:

final int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready) );
} else {
    layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));
}

Mais je pense que le problème se produit parce que vous essayez de charger de grandes images.
Voici un bon tutoriel sur la façon de charger des bitmaps volumineux.

MISE À JOUR:
getDrawable (int) déconseillé au niveau API 22


getDrawable(int ) est désormais déconseillé au niveau API 22. Vous devez plutôt utiliser le code suivant de la bibliothèque de support:

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

Si vous vous référez au code source de ContextCompat.getDrawable , il vous donne quelque chose comme ceci:

/**
 * Return a drawable object associated with a particular resource ID.
 * <p>
 * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned
 * drawable will be styled for the specified Context's theme.
 *
 * @param id The desired resource identifier, as generated by the aapt tool.
 *            This integer encodes the package, type, and resource entry.
 *            The value 0 is an invalid identifier.
 * @return Drawable An object that can be used to draw this resource.
 */
public static final Drawable getDrawable(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 21) {
        return ContextCompatApi21.getDrawable(context, id);
    } else {
        return context.getResources().getDrawable(id);
    }
}

Plus de détails sur ContextCompat

À partir de l'API 22, vous devez utiliser la getDrawable(int, Theme)méthode au lieu de getDrawable (int).

MISE À JOUR:
Si vous utilisez la bibliothèque de support v4, les éléments suivants seront suffisants pour toutes les versions.

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

Vous devrez ajouter les éléments suivants dans votre application build.gradle

compile 'com.android.support:support-v4:23.0.0' # or any version above

Ou en utilisant ResourceCompat, dans n'importe quelle API comme ci-dessous:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Ninja paresseux
la source
3
'getDrawable (int)' est obsolète.
S.M_Emamian
Hé, j'essaie de faire une tâche uniquement si l'image d'arrière-plan d'un bouton d'image est une certaine ressource utilisable. Comment puis-je comparer ... J'ai essayé if(buttonBackground.equals(R.drawable.myDrawable))Drawable buttonBackground = myButton.getBackground();j'obtiens cette erreur: snag.gy/weYgA.jpg
Ruchir Baronia
Vous auriez également besoin myActivity.getTheme()de la dernière version de la méthode, au lieu du paramètre null:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon
ou vous pouvez utiliser à la AppCompatResources.getDrawable(this.getContext(), resId)place, Google l'a déjà implémenté dans un AppCompat*widget / vue, par exemple:android.support.v7.widget.AppCompatCheckBox
mochadwi
108

Essaye ça:

layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));

et pour l'API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad
la source
2
mais c'est la même chose Ahmad :)
Mohammad Ersan
4
ah ok, je me réfère à la réponse de Lazy Ninjas.
Ahmad
39
Vous n'en avez pas besoin getResources().getDrawable(). Le bon code est layout.setBackgroundResource(R.drawable.ready);exactement comme l'OP utilisé. Le problème vient ici de la taille du bitmap.
BVB
1
setBackground est de niveau API 16 ou supérieur uniquement.
Erwan
17
RelativeLayout relativeLayout;  //declare this globally

maintenant, à l'intérieur de n'importe quelle fonction comme onCreate, onResume

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this
Sujay Kumar
la source
9

Vous pouvez également définir l'arrière-plan de n'importe quelle image:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
Bhaskar Kumar Singh
la source
cela résout mon problème, mais je dois implémenter l' (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)intérieur du code
Armando Marques Sobrinho
1
C'est obsolète maintenant
user7856586
4

J'utilise un minSdkVersion 16 et targetSdkVersion 23.
Ce qui suit fonctionne pour moi, il utilise

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

À la place d'utiliser:

layout.setBackgroundResource(R.drawable.ready);

Utilisez plutôt:

layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));

getActivity()est utilisé dans un fragment, si vous appelez depuis une activité this.

Vostro
la source
2

Si vos arrière-plans se trouvent dans le dossier drawable, essayez de déplacer les images du dossier drawable vers drawable-nodpi dans votre projet. Cela a fonctionné pour moi, semble que sinon les images sont redimensionnées par eux-mêmes ..

Jordy
la source
5
Eh bien, si vous n'avez pas une copie des images que vous devez utiliser dans le projet en qualité HD, pourquoi laisser Android les redimensionner à une qualité merdique en utilisant le dossier dessinable normal. Et même si la question est ancienne, si elle apparaît toujours dans Google que de publier quelque chose de nouveau, c'est ok à mon humble avis.
Jordy
1

Utilisez butterknife pour lier la ressource drawable à une variable en l'ajoutant en haut de votre classe (avant toute méthode).

@Bind(R.id.some_layout)
RelativeLayout layout;
@BindDrawable(R.drawable.some_drawable)
Drawable background;

puis à l'intérieur de l'une de vos méthodes, ajoutez

layout.setBackground(background);

C'est tout ce dont vous avez besoin

Stephen
la source
1
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
     layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.ready));
else if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1)
     layout.setBackground(getResources().getDrawable(R.drawable.ready));
else
     layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));
Sameer Chamankar
la source
1

Essayez ViewCompat.setBackground(yourView, drawableBackground)

Umair Khalid
la source
0

Essayez ce code:

Drawable thumb = ContextCompat.getDrawable(getActivity(), R.mipmap.cir_32);
mSeekBar.setThumb(thumb);
Ashwin H
la source
0

essaye ça.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
Franklin CI
la source
0
setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));
Mohamed AbdelraZek
la source
1
Explication de l'annonce, s'il vous plaît.
vonbrand
-1

À l'intérieur de l'application / res / your_xml_layout_file .xml

  1. Attribuez un nom à votre mise en page parent.
  2. Accédez à votre MainActivity et recherchez votre RelativeLayout en appelant findViewById (R.id. "Given_name").
  3. Utilisez la disposition comme un objet classique, en appelant la méthode setBackgroundColor ().
Vaggos Phl
la source