2010-05-21 12 views
20

Mam następujące LinearLayout. Nie rozumiem, że jeśli ustawię tło dla innego obrazu, informacje o dopełnieniu zostaną zresetowane. Czy istnieje sposób, aby temu zapobiec?Czy zmiana tła powoduje również zmianę dopełnienia linii 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> 

widzę pozycja dzieci otrzymują przesunięte kiedy zmienić rozciągliwej tła LinearLayoutaPanel.

+0

Jaki jest Twój dowód, że „informacje wyściółka są reset”? Innymi słowy, jakie są twoje rzeczywiste objawy? – CommonsWare

+2

Ten sam problem, co http://stackoverflow.com/questions/5890379/android-setbackgroundresource-discards-my-xml-layout-attributes - dopełnienie po prostu zostaje zresetowane po wywołaniu funkcji setBackgroundResource() (prawdopodobnie dotyczy tylko 9-plasterkowych środowisk). –

Odpowiedz

36

Jest to domyślne zachowanie podczas zmiany tła Drawable na View. Według Romain Guy, jednego z programistów Androida: "Powodem, dla którego ustawienie obrazu resetuje dopełnienie, jest fakt, że 9-plasterkowe obrazy mogą kodować wypełnienie." Zobacz jego pełną odpowiedź w similar question.

Rozwiązaniem jest zresetowanie dopełnienia w kodzie przy każdej zmianie tła.

+0

@ Michael proszę oznaczyć to jako poprawną odpowiedź. – Sufian

14

This to podobne pytanie.

w skrócie, odpowiedź byłaby:

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

Powodem padding zerują się tak, ponieważ odkształcalne może być odkształcalne 9-łata.

+1

Można również ustawić tło za pomocą selektora z odpowiednim zestawem stanów. Wtedy nie musisz przywracać padów. –

+0

@ ArkadiuszCieśliński Pewnie. zależy od przypadku i twoich potrzeb. –

+0

@androiddeveloper Musiałem opublikować działające na widoku, aby podszewka działała, dlaczego tak się dzieje? –

0

Można użyć kształt ustawić tło z jednego koloru lub obrazu i zastosować dopełnienie takiego:

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