我有一个视图,用作一个项目ListView.在我的自定义适配器中,我View.setBackgroundResource()根据项目在列表中的位置更改视图的背景.(我对列表中的第一个和最后一个项目有单独的资产.)
这会按预期设置正确的背景图像,但它具有令人讨厌的副作用,即我在视图的XML定义中设置的所有填充都被完全忽略.
(如果我在XML中设置了可绘制的背景,并且在运行时不要尝试在适配器中改变它,那么填充一切正常.)
如何更改背景图像并保留填充?这是一个错误吗?
编辑似乎其他人在这里发现了同样的问题:更改背景是否也改变了LinearLayout的填充?
任何人都可以向我解释为什么会这样吗?
我有一个相当简单的类扩展TextView.当我将背景颜色设置为Color.BLUE时,填充工作正常.当我将后台资源更改为android.R.drawable.list_selector_background时,我的填充不再应用.什么F?
这是我的UI类:
public class GhostDropDownOption extends TextView {
TextView text_view;
public GhostDropDownOption(Context context, AttributeSet attrs) {
super(context, attrs);
setup(context);
}
public GhostDropDownOption(Context context) {
super(context);
setup(context);
}
private void setup(Context context) {
this.setClickable(false);
// THE 2 LINES BELOW ARE THE ONLY THING I'M CHANGING
//this.setBackgroundResource(android.R.drawable.list_selector_background);
this.setBackgroundColor(Color.BLUE);
}
}
Run Code Online (Sandbox Code Playgroud)
而我在布局中使用它像这样:
<trioro.voyeur.ui.GhostDropDownOption
android:id="@+id/tv_dropdown_option_1"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="@string/request_control_dropdown_option_1"
android:textColor="#000000"
android:padding="10dip"/>
Run Code Online (Sandbox Code Playgroud)
这是改变背景的结果:

我有一个贴有九个补丁的图像,我在activity.onCreate()期间设置了textview的背景。Textview具有WRAP_CONTENT布局,用于高度和宽度。它是通过代码而不是XML创建的。
_btnCurrent.setBackgroundResource(R.drawable.button_menu_off);
Run Code Online (Sandbox Code Playgroud)
这很好。我还有另外一张九幅图像,大小相同,唯一的区别是颜色。现在,如果以后再用其他图像调用setBackgroundResource,它将增加textview的高度,几乎增加一倍。另一个调用来自textview.onClick()
_btnCurrent.setBackgroundResource(R.drawable.button_menu_on);
Run Code Online (Sandbox Code Playgroud)
如果我再次调用它(在文本视图中再次单击),则没有任何效果。这很好,我想它也会在第一次点击时发生。所以:
Activity.onCreate()
{
btnCurrent= new TextView(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
btnCurrent.setBackgroundResource(R.drawable.button_menu_hs_off);
btnCurrent.setPadding(15, 5, 15, 5);
btnCurrent.setGravity(Gravity.CENTER);
btnCurrent.setText( GetString(id) );
btnCurrent.setOnClickListener(this);
}
onClick()
{
_btnCurrent.setBackgroundResource(R.drawable.button_menu_on);
}
onCreate(); // -> called by Android during startup -> OK
....
onClick(); // called when user clicks on it -> btnCurrent has double height
....
onClick(); // called when user clicks again -> btnCurrent has same double height, no change in size
....
onClick(); // called when user clicks …Run Code Online (Sandbox Code Playgroud) 在设置背景填充后,将背景资源设置为textview的可绘制xml不会填充textview,但是反之亦然。怎么样 ?
例
作品
textView.setBackgroundResource(borderColor);
textView.setPadding(10, 0, 10, 0);
Run Code Online (Sandbox Code Playgroud)
不起作用
textView.setPadding(10, 0, 10, 0);
textView.setBackgroundResource(borderColor);
Run Code Online (Sandbox Code Playgroud) android ×4
textview ×2
android-view ×1
background ×1
drawable ×1
layer-list ×1
padding ×1
resize ×1