我有一个在ListView
中用作项目的视图。在我的自定义适配器中,我使用View.setBackgroundResource()
根据项目在列表中的位置更改视图的背景。(对于列表中的第一项和最后一项,我有单独的资源。)
这会像预期的那样设置正确的背景图像,但它有一个很糟糕的副作用,即我在视图的XML定义中设置的所有填充都被完全忽略了。
(如果我在XML中设置了可绘制的背景,并且不试图在运行时在适配器中更改它,则填充都可以正常工作。)
我如何改变背景图像,并保留填充?这是一个bug吗?
编辑似乎其他人在这里也发现了同样的问题:Does changing the background also change the padding of a LinearLayout?
发布于 2011-05-05 06:12:12
我也遇到了这个问题。假设您使用的是可绘制的LayerList资源?这就是我所用的。不幸的是,我没有找到“真正的”方法来修复它,它看起来像是代码中的错误,但我没有追查到它。不过,幸运的是,我是在视图被正确渲染之后才设置"buggy“背景的,所以只需要在设置好背景后保存并恢复填充值,例如:
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);
}
编辑:作为另一种选择,您不必使用以前的填充的值,也可以使用尺寸值:
int pad = resources.getDimensionPixelSize(R.dimen.linear_layout_padding);
theView.setBackgroundResource(R.drawable.entry_bg_with_image);
theView.setPadding(pad, pad, pad, pad);
发布于 2013-04-09 02:14:17
在dmon建议的基础上,您可以在util类中添加一个函数,这样您就不必在每次更新资源时跳转。这实际上只是他的代码包装在一个函数中。
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);
}
发布于 2015-03-30 22:51:43
这是在棒棒糖中修复的,所以
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);
}
}
https://stackoverflow.com/questions/5890379
复制相似问题