2010-05-21 10 views
20

Ho il seguente LinearLayout. Quello che non capisco è che se si imposta lo sfondo su un'altra immagine, le informazioni sul padding vengono ripristinate. C'è un modo per impedirlo?Il cambio dello sfondo cambia anche il padding di un 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> 

vedo la posizione dei bambini ottenere spostato quando cambio la drawable del LinearLayoutaPanel sfondo.

+0

Qual è la sua prova che "l'informazione imbottitura sono di reset"? In altre parole, quali sono i tuoi sintomi attuali? – CommonsWare

+2

Lo stesso problema di http://stackoverflow.com/questions/5890379/android-setbackgroundresource-discards-my-xml-layout-attributes - il padding viene semplicemente reimpostato dopo che viene chiamato setBackgroundResource() (probabilmente correlato solo agli sfondi con 9 patch)). –

risposta

36

Questo è il comportamento predefinito quando si cambia lo sfondo Drawable su un View. Secondo Romain Guy, uno degli sviluppatori Android, "Il motivo per cui l'impostazione di un'immagine ripristina il padding è perché le immagini a 9 patch possono codificare il padding." Vedi la sua risposta completa in un similar question.

La correzione consiste nel reimpostare il padding nel codice ogni volta che si modifica il background drawable.

+0

@michael per favore contrassegna come risposta corretta. – Sufian

14

This è una domanda simile.

in breve, la risposta sarebbe:

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 ragione per l'imbottitura essere ripristinato perché il drawable potrebbe essere un disegnabile 9-patch.

+1

È inoltre possibile impostare lo sfondo utilizzando il selettore con il set di stati appropriato. Quindi non è necessario ripristinare i padding –

+0

@ ArkadiuszCieśliński Sure. dipende dal caso e dalle tue esigenze –

+0

@androiddeveloper Ho dovuto postare un runnable alla vista per far funzionare il padding, perché sta succedendo questo? –

0

È possibile utilizzare la forma per impostare lo sfondo con singolo colore o l'immagine e applicare imbottiture in questo modo:

<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> 
Problemi correlati