web-dev-qa-db-fra.com

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

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?

243
Chad Bingham

layout.setBackgroundResource(R.drawable.ready); est correct.
Une autre façon de le faire consiste à utiliser ce qui suit:

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 pose parce que vous essayez de charger de grandes images.
Here est un bon tutoriel sur le chargement de bitmaps volumineux.

UPDATE:
getDrawable (int) obsolète dans l'API niveau 22


getDrawable(int ) est maintenant obsolète dans le niveau 22 de l'API. 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 , cela vous donne quelque chose comme:

/**
 * 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 méthode getDrawable(int, Theme) à la place de getDrawable (int).

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

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

Vous devrez ajouter ce qui suit 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 celle ci-dessous:

import Android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
435
Lazy Ninja

Essaye ça:

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

et pour API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
100
Ahmad
RelativeLayout relativeLayout;  //declare this globally

maintenant, dans 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
14
Sujay Kumar

Vous pouvez également définir le fond de n'importe quelle image:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
7
Bhaskar Kumar Singh

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

3
Jordy

J'utilise les versions 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);

Plutôt utiliser:

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

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

2
Vostro
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));
1
Sameer Chamankar

Utilisez butterknife pour lier la ressource extractible à 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

1
Stephen

À 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 trouvez votre RelativeLayout en appelant le findViewById (R.id. "Prenom_nom").
  3. Utilisez la présentation comme un objet classique en appelant la méthode setBackgroundColor ().
0
Vaggos Phl

essaye ça.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
0
Franklin CI

Essayez ce code:

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

Essayer ViewCompat.setBackground(yourView , drawableBackground)

0
Umair Khalid