Android 为什么在设置xml backgroundResource时视图会丢失填充?

Android 为什么在设置xml backgroundResource时视图会丢失填充?,android,view,background,resources,padding,Android,View,Background,Resources,Padding,在安卓系统中,您可以通过xml设置背景,一切都很好。在某些特殊情况下,我需要在Java中设置它(即更改列表行)。人们可能会认为他可以宣布: View v = findViewById(R.id.some_view); v.setBackgroundResource(R.drawable.somedrawable); 但不幸的是,这种特殊的观点正在失去它的填充物。我有这样一种简单的方法,效果很好: private void applyDifferentBackgroundResource(int

在安卓系统中,您可以通过xml设置背景,一切都很好。在某些特殊情况下,我需要在Java中设置它(即更改列表行)。人们可能会认为他可以宣布:

View v = findViewById(R.id.some_view);
v.setBackgroundResource(R.drawable.somedrawable);
但不幸的是,这种特殊的观点正在失去它的填充物。我有这样一种简单的方法,效果很好:

private void applyDifferentBackgroundResource(int resId, View v){
        final int paddingBottom = v.getPaddingBottom();
        final int paddingLeft   = v.getPaddingLeft();
        final int paddingRight  = v.getPaddingRight();
        final int paddingTop    = v.getPaddingTop();
        v.setBackgroundResource(resId);
        v.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
}

但出于好奇:有没有原因,为什么视图会丢失填充,或者
setBackgroundResource
的Android代码不能(或不应该)处理填充本身

您是否碰巧使用了9-patch?是的,9-patch有自己的填充--如果您正在使用它们,您需要保存并恢复填充,正如您所做的那样。不久前,我和一些朋友进行了一次长时间的交谈,但我记不起现在的答案是哪个更重要:9-patch padding还是padding属性。无论哪种方法,如果两个背景图像中的填充应该保持不变,那么在第二种方法中更改背景是最好的方法。不,它是通过xml声明的可绘制的。没有涉及9-补丁你在背景改变时松开了填充,参考-