studio gama fondos degrade colores animaciones android background drawable padding layer-list

android - gama - setBackgroundResource() descarta mis atributos de diseño XML



gradients android background (5)

Tengo una vista que se usa como un elemento en un ListView . En mi adaptador personalizado, cambio el fondo de la vista usando View.setBackgroundResource() dependiendo de la posición del elemento en la lista. (Tengo activos separados para el primer y el último elemento de la lista).

Esto establece la imagen de fondo correcta como se esperaba, pero tiene el desagradable efecto secundario de que todo el relleno que establecí en la definición XML de la vista se ignora por completo.

(Si configuro el fondo dibujable en el XML, y no trato de variarlo en el tiempo de ejecución en el adaptador, el relleno funciona bien).

¿Cómo puedo modificar la imagen de fondo y conservar el relleno? ¿Es esto un error?

EDITAR Parece que alguien más ha encontrado el mismo problema aquí: ¿Cambiar el fondo también cambia el relleno de un LinearLayout?


Añadiendo a lo que Dmon ha sugerido, aquí hay una función que puedes agregar a tu clase de utilidades para que no tengas que saltar por los aros cada vez que actualices un recurso. Esto es realmente solo su código envuelto en una función.

public static void updateBackgroundResourceWithRetainedPadding(View view, int resourceID) { int bottom = view.getPaddingBottom(); int top = view.getPaddingTop(); int right = view.getPaddingRight(); int left = view.getPaddingLeft(); view.setBackgroundResource(resourceID); view.setPadding(left, top, right, bottom); }


En Monodroid, si publico la llamada a SetBackgroundResource, entonces el relleno superior y el relleno inferior permanecen inalterados

private EditText _etInput public void Disable() { _etInput.Post(() => { _etInput.SetBackgroundResource(Resource.Drawable.input_field_background_disabled); _etInput.Clickable = false; });

Sin embargo, el margen izquierdo se restablece a 0! Si no se publica, todo el relleno se restablece a 0.

Pensé que era un hallazgo interesante que valía la pena publicar sobre ...


Esto está arreglado en Lollipop, entonces

public static void setBackgroundResource(@NonNull View view, @DrawableRes int resId) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int paddingTop = view.getPaddingTop(); int paddingLeft = view.getPaddingLeft(); int paddingRight = view.getPaddingRight(); int paddingBottom = view.getPaddingBottom(); view.setBackgroundResource(resId); view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } else { view.setBackgroundResource(resId); } }


Me encontré con este problema también. Presumiblemente, ¿está utilizando un recurso dibujable de LayerList? Eso es lo que estaba usando. Desafortunadamente, no encontré una forma "real" de solucionarlo, parece un error en el código, pero no lo busqué. Sin embargo, tuve suerte en el sentido de que estaba configurando el fondo "con errores" después de que mi vista ya se había renderizado correctamente, por lo que solo era cuestión de guardar y restaurar los valores del relleno después de configurar el fondo, por ejemplo:

if(condition) { int bottom = theView.getPaddingBottom(); int top = theView.getPaddingTop(); int right = theView.getPaddingRight(); int left = theView.getPaddingLeft(); theView.setBackgroundResource(R.drawable.entry_bg_with_image); theView.setPadding(left, top, right, bottom); }

EDITAR: como alternativa, no tiene que usar los valores previos de relleno, también puede usar un valor de dimensión:

int pad = resources.getDimensionPixelSize(R.dimen.linear_layout_padding); theView.setBackgroundResource(R.drawable.entry_bg_with_image); theView.setPadding(pad, pad, pad, pad);


Otra solución en la que opté por obtener y establecer el relleno en el código que propuso Dmon es no utilizar relleno y en su lugar usar márgenes para elementos internos.

Dependiendo de su diseño, en realidad puede ser la misma cantidad de código XML y no requeriría Java en absoluto. Me parece un poco más sucio, pero no tan sucio como agregar ese código Java en todas partes.