25

我有以下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>

当我更改LinearLayout aPanel的背景可绘制对象时,我看到孩子们的位置发生了变化。

4

3 回答 3

43

这是更改背景时的默认Drawable行为View。根据 Android 开发人员之一 Romain Guy 的说法,“设置图像重置填充的原因是因为 9-patch 图像可以对填充进行编码。” 在类似问题中查看他的完整答案。

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

于 2012-05-06T08:09:39.297 回答
20

是一个类似的问题。

简而言之,答案是:

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

padding 被重置的原因是因为 drawable 可能是 9-patch drawable 。

于 2013-02-17T08:34:59.947 回答
4

您可以使用 shape 设置具有单一颜色或图像的背景并应用填充,如下所示:

<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>
于 2016-05-20T07:55:17.300 回答