Cómo configurar el fondo dibujable mediante programación en Android
Para configurar el fondo:
RelativeLayout layout = (RelativeLayout) findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.ready);
¿Es la mejor manera de hacerlo?
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);
Prueba esto:
layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));
y para API 16<:
layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
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
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
.
Si usas AndroidX, debes usar:
AppCompatResources.getDrawable(context, R.drawable.your_drawable)
Los métodos anteriores enumerados están en desuso.