2010-05-21 10 views
20

Ich habe folgende LinearLayout. Was ich nicht verstehe ist, wenn ich den Hintergrund auf ein anderes Bild setze, werden die Padding-Informationen zurückgesetzt. Gibt es einen Weg dies zu verhindern?Ändert das Ändern des Hintergrunds auch das Padding eines LinearLayouts?

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

Ich sehe die Lage der Kinder verschoben werden, wenn ich den Hintergrund ziehbar des LinearLayoutApanel ändern.

+0

Was ist Ihr Beweis dafür, dass „die Auffüllinformationen zurückgesetzt werden“? Mit anderen Worten, was sind Ihre eigentlichen Symptome? – CommonsWare

+2

Das gleiche Problem wie http://StackOverflow.com/Questions/5890379/android-SetbackgroundResource-Discards-My-XML-Layout-Attributes - die Auffüllung wird einfach zurückgesetzt, nachdem setBackgroundResource() aufgerufen wurde (möglicherweise nur 9-Patch-Hintergründe verwandt)). –

Antwort

36

Dies ist das Standardverhalten beim Ändern des Hintergrunds Drawable auf einem View. Romain Guy, einer der Android-Entwickler, erklärt: "Der Grund dafür, dass ein Bild zurückgesetzt wird, liegt darin, dass 9-Patch-Bilder das Padding kodieren können." Siehe seine vollständige Antwort in einer similar question.

Die Korrektur besteht darin, die Auffüllung in Code jedes Mal zurückzusetzen, wenn Sie den Hintergrund ändern, der gezeichnet werden kann.

+0

@michael bitte markieren Sie dies als richtige Antwort. – Sufian

14

This ist eine ähnliche Frage.

kurz gesagt, wäre die Antwort:

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

Der Grund für die Polsterung zurückgesetzt zu werden, weil die ziehbar könnte ein 9-Patch ziehbar sein.

+1

Sie können den Hintergrund auch mithilfe des Selektors mit den entsprechenden Statuseinstellungen festlegen. Dann müssen Sie Padings –

+0

@ ArkadiuszCieśliński Sure nicht wiederherstellen. hängt von dem Fall und Ihren Bedürfnissen ab –

+0

@androiddeveloper Ich musste eine Runnable auf der Ansicht veröffentlichen, um die Auffüllung funktionieren zu lassen, warum passiert das? –

0

Sie können Form verwenden, um den Hintergrund mit einzelner Farbe oder das Bild zu setzen und Polsterung wie dies gilt:

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