2010-05-21 36 views
20

我有以下LinearLayout。我不明白的是,如果我將背景設置爲另一個圖像,則會重置填充信息。有沒有辦法來防止這種情況?更改背景是否也會更改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> 

我看到孩子的位置,當我改變LinearLayoutaPanel的背景繪製得到轉移。

+0

什麼是你的證據表明,「填補信息復位」?換句話說,你的實際症狀是什麼? – CommonsWare 2010-05-22 15:08:45

+2

同樣的問題,因爲http://stackoverflow.com/questions/5890379/android-setbackgroundresource-discards-my-xml-layout-attributes - 填充只是在調用setBackgroundResource()後被重置(可能與9補丁背景有關)。 – 2011-08-29 22:39:20

回答

36

這是在View上更改背景Drawable時的默認行爲。根據Android開發人員之一Romain Guy的說法,「設置圖像重置填充的原因是因爲9貼片圖像可以編碼填充。」在similar question中查看他的完整答案。

修復方法是在每次更改背景可繪製時重置代碼中的填充。

+0

@ michael請將此標記爲正確答案。 – Sufian 2015-02-13 08:02:40

14

This是一個類似的問題。

總之,答案應該是:

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

的原因填充重置是因爲繪製可能是9補丁繪製。

+1

您還可以使用具有適當狀態組的選擇器來設置背景。那麼你不必恢復填充 – 2015-02-06 16:28:40

+0

@ArkadiuszCieśliński當然。取決於案例和你的需求 – 2015-02-06 22:22:43

+0

@androiddeveloper我不得不發佈一個可運行的視圖來使填充工作,爲什麼會發生這種情況? – 2015-06-26 11:11:56

0

您可以使用形狀來設定單一顏色或圖片的背景和應用填充像這樣:

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