首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >setBackgroundResource()丢弃我的XML布局属性

setBackgroundResource()丢弃我的XML布局属性
EN

Stack Overflow用户
提问于 2011-05-05 06:01:09
回答 5查看 22.9K关注 0票数 71

我有一个在ListView中用作项目的视图。在我的自定义适配器中,我使用View.setBackgroundResource()根据项目在列表中的位置更改视图的背景。(对于列表中的第一项和最后一项,我有单独的资源。)

这会像预期的那样设置正确的背景图像,但它有一个很糟糕的副作用,即我在视图的XML定义中设置的所有填充都被完全忽略了。

(如果我在XML中设置了可绘制的背景,并且不试图在运行时在适配器中更改它,则填充都可以正常工作。)

我如何改变背景图像,并保留填充?这是一个bug吗?

编辑似乎其他人在这里也发现了同样的问题:Does changing the background also change the padding of a LinearLayout?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-05 06:12:12

我也遇到了这个问题。假设您使用的是可绘制的LayerList资源?这就是我所用的。不幸的是,我没有找到“真正的”方法来修复它,它看起来像是代码中的错误,但我没有追查到它。不过,幸运的是,我是在视图被正确渲染之后才设置"buggy“背景的,所以只需要在设置好背景后保存并恢复填充值,例如:

代码语言:javascript
复制
  if(condition) {
    int bottom = theView.getPaddingBottom();
    int top = theView.getPaddingTop();
    int right = theView.getPaddingRight();
    int left = theView.getPaddingLeft();
    theView.setBackgroundResource(R.drawable.entry_bg_with_image);
    theView.setPadding(left, top, right, bottom);
  }

编辑:作为另一种选择,您不必使用以前的填充的值,也可以使用尺寸值:

代码语言:javascript
复制
  int pad = resources.getDimensionPixelSize(R.dimen.linear_layout_padding);
  theView.setBackgroundResource(R.drawable.entry_bg_with_image);
  theView.setPadding(pad, pad, pad, pad);
票数 106
EN

Stack Overflow用户

发布于 2013-04-09 02:14:17

在dmon建议的基础上,您可以在util类中添加一个函数,这样您就不必在每次更新资源时跳转。这实际上只是他的代码包装在一个函数中。

代码语言:javascript
复制
public static void updateBackgroundResourceWithRetainedPadding(View view, int resourceID)
{
    int bottom = view.getPaddingBottom();
    int top = view.getPaddingTop();
    int right = view.getPaddingRight();
    int left = view.getPaddingLeft();
    view.setBackgroundResource(resourceID);
    view.setPadding(left, top, right, bottom);
}
票数 11
EN

Stack Overflow用户

发布于 2015-03-30 22:51:43

这是在棒棒糖中修复的,所以

代码语言:javascript
复制
public static void setBackgroundResource(@NonNull View view, @DrawableRes int resId) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        int paddingTop = view.getPaddingTop();
        int paddingLeft = view.getPaddingLeft();
        int paddingRight = view.getPaddingRight();
        int paddingBottom = view.getPaddingBottom();
        view.setBackgroundResource(resId);
        view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
    } else {
        view.setBackgroundResource(resId);
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档