2010-05-21 2 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

+2

Та же проблема, что и http://stackoverflow.com/questions/5890379/android-setbackgroundresource-discards-my-xml-layout-attributes - простуда просто сбрасывается после вызова setBackgroundResource() (возможно, связанного только с фоном из 9 патчей). –

ответ

36

Это поведение по умолчанию при смене фона Drawable на View. По словам Ромена Гая, одного из разработчиков Android: «Причина, почему настройка изображения сбрасывает заполнение, состоит в том, что изображения с 9 патчами могут кодировать отступы». Посмотрите его полный ответ в similar question.

Исправление состоит в том, чтобы сбросить заполнение в коде каждый раз, когда вы меняете исходный рисунок.

+0

@michael, пожалуйста, отметьте это как правильный ответ. – Sufian

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

Вы также можете установить фон с помощью селектора с соответствующим набором состояний. Тогда вам не нужно восстанавливать прокладки –

+0

@ ArkadiuszCieśliński Конечно. зависит от случая и ваших потребностей. –

+0

@androiddeveloper Мне пришлось опубликовать runnable к представлению, чтобы сделать дополнение, почему это происходит? –

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> 
Смежные вопросы