Cómo configurar el fondo dibujable mediante programación en Android

Resuelto Chad Bingham asked hace 54 años • 14 respuestas

Para configurar el fondo:

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

¿Es la mejor manera de hacerlo?

Chad Bingham avatar Jan 01 '70 08:01 Chad Bingham
Aceptado

layout.setBackgroundResource(R.drawable.ready);es correcto.
Otra forma de lograrlo es utilizar lo siguiente:

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));
}

Pero creo que el problema ocurre porque estás intentando cargar imágenes grandes.
Aquí hay un buen tutorial sobre cómo cargar mapas de bits grandes.

ACTUALIZACIÓN:
getDrawable(int ) obsoleto en el nivel de API 22


getDrawable(int ) ahora está en desuso en el nivel de API 22. En su lugar, debe usar el siguiente código de la biblioteca de soporte:

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

Si consulta el código fuente de ContextCompat.getDrawable , obtendrá algo como esto:

/**
 * 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);
    }
}

Más detalles sobre ContextCompat

A partir de API 22, debes usar el getDrawable(int, Theme)método en lugar de getDrawable(int).

ACTUALIZACIÓN:
Si está utilizando la biblioteca de soporte v4, lo siguiente será suficiente para todas las versiones.

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

Deberá agregar lo siguiente en su aplicación build.gradle

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

O usando ResourceCompat, en cualquier API como se muestra a continuación:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Lazy Ninja avatar Sep 21 '2012 01:09 Lazy Ninja

Prueba esto:

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

y para API 16<:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad avatar Sep 21 '2012 01:09 Ahmad
RelativeLayout relativeLayout;  //declare this globally

ahora, dentro de cualquier función como 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 avatar Dec 08 '2013 09:12 Sujay Kumar

Estoy usando minSdkVersion 16 y targetSdkVersion 23.
Lo siguiente me funciona, usa

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

En lugar de usar:

layout.setBackgroundResource(R.drawable.ready);

Más bien usa:

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

getActivity()se usa en un fragmento, si se llama desde una actividad this.

Vostro avatar Mar 30 '2016 10:03 Vostro

Si usas AndroidX, debes usar:

AppCompatResources.getDrawable(context, R.drawable.your_drawable)

Los métodos anteriores enumerados están en desuso.

Firzen avatar Aug 22 '2021 09:08 Firzen