Does changing the background also change the padding of a LinearLayout?
I have the following LinearLayout
. What I don't understand is if I set the background to another image, the padding information are reset. Is there a way to prevent this?
<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 -->
&开发者_运维问答lt;/LinearLayout>
I see the position of the children get shifted when I change the background drawable of the LinearLayout
aPanel.
This is the default behavior when changing the background Drawable
on a View
. According to Romain Guy, one of the Android developers, "The reason why setting an image resets the padding is because 9-patch images can encode padding." See his full answer in a similar question.
The fix is to reset the padding in code each time you change the background drawable.
This is a similar question.
in short, the answer would be :
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);
}
The reason for the padding being reset is because the drawable might be a 9-patch drawable .
You can use shape to set the background with single colour or image and apply padding like this:
<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>
精彩评论