2010-05-21 7 views
20

Tengo el siguiente LinearLayout. Lo que no entiendo es si configuro el fondo de otra imagen, la información de relleno se restablece. ¿Hay alguna forma de prevenir esto?¿Cambiar el fondo también cambia el relleno de LinearLayout?

<LinearLayout android:id="@+id/aPanel" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:background="@drawable/bkground" 
    android:paddingLeft="15dp" android:paddingRight="15dp"> 

    <!-- some children here --> 
    </LinearLayout> 

que ver la posición de los niños se mueva al cambio el fondo de la dibujable LinearLayoutaPanel.

+0

¿Cuál es su evidencia de que "la información de relleno son de reinicio"? En otras palabras, ¿cuáles son tus síntomas reales? – CommonsWare

+2

Mismo problema que http://stackoverflow.com/questions/5890379/android-setbackgroundresource-discards-my-xml-layout-attributes - el relleno simplemente se restablece después de llamar a setBackgroundResource() (posiblemente relacionado solo con fondos de 9 parches)) –

Respuesta

36

Este es el comportamiento predeterminado al cambiar el fondo Drawable en un View. Según Romain Guy, uno de los desarrolladores de Android, "La razón por la que configurar una imagen restablece el relleno es porque las imágenes de 9 parches pueden codificar el relleno". Vea su respuesta completa en un similar question.

La solución es restablecer el relleno en el código cada vez que cambie el fondo dibujable.

+0

@michael, marque esto como respuesta correcta. – Sufian

14

This es una pregunta similar.

en pocas palabras, la respuesta sería:

public static void setViewBackgroundWithoutResettingPadding(final View v, final int backgroundResId) { 
    final int paddingBottom = v.getPaddingBottom(), paddingLeft = v.getPaddingLeft(); 
    final int paddingRight = v.getPaddingRight(), paddingTop = v.getPaddingTop(); 
    v.setBackgroundResource(backgroundResId); 
    v.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); 
} 

La razón para el relleno se restablezcan los valores se debe a que el dibujable podría ser un estirable 9-parche.

+1

También puede establecer el fondo utilizando el selector con el conjunto adecuado de estados. Entonces usted no tiene que restaurar las compuertas –

+0

@ ArkadiuszCieśliński Claro. depende del caso y sus necesidades –

+0

@androiddeveloper Tuve que publicar un ejecutable en la vista para que funcione el relleno, ¿por qué está sucediendo esto? –

0

Puede usar la forma de establecer el fondo con un solo color o una imagen y aplicar el relleno de esta manera:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#FFFFFF"/> 
    <corners 
     android:bottomLeftRadius="8dip" 
     android:topLeftRadius="8dip"/> 
    <padding 
     android:bottom="0dip" 
     android:left="0dip" 
     android:right="0dip" 
     android:top="0dip"/> 
</shape> 
Cuestiones relacionadas