更改背景是否也会改变LinearLayout的填充?

mic*_*ael 23 android background padding android-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>
Run Code Online (Sandbox Code Playgroud)

当我改变LinearLayout aPanel的背景可绘制时,我看到孩子的位置被移动了.

hap*_*ude 41

这是默认的行为改变背景时DrawableView.根据Android开发人员之一Romain Guy的说法,"设置图像重置填充的原因是因为9个补丁图像可以编码填充." 在类似的问题中查看他的完整答案.

修复方法是每次更改背景可绘制时重置代码中的填充.


and*_*per 19

是一个类似的问题.

简而言之,答案是:

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);
}
Run Code Online (Sandbox Code Playgroud)

重置填充的原因是因为drawable可能是9-patch drawable.