自定义RelativeLayout上的setBackground不起作用

时间:2014-04-08 19:12:11

标签: android android-layout

所有

我有一个自定义RelativeLayout,在加载视图后,我想将RelativeLayout的背景更改为drawable。我无法弄清楚为什么它不起作用......似乎应该这么简单。

以下是我的自定义布局代码:

public class InputBoxView extends RelativeLayout {

    //My variables

    //Irrelevants initalizers

    //Method in question
    public void addErrorBox() {
        setBackgroundResource(R.drawable.error_border);
    }

}

以下是自定义视图的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/standard_line_height"
    android:background="@android:color/white" >

    <View
        style="@style/space_view"
        android:layout_alignParentTop="true" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true">

        <TextView
            android:id="@+id/input_box_textview"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".35"
            android:padding="10dp"
            android:text="Key" />

        <EditText
            android:id="@+id/input_box_edittext"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.65"
            android:layout_marginRight="10dp" />
    </LinearLayout>

    <View
        style="@style/space_view"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

这是我的error_border

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="@android:color/white" />
    <stroke android:width="2dp" android:color="@color/red"/>
</shape>

当我从我的活动中调用addErrorBox方法时,我的背景不会明显更改,但如果我在InputBoxView的实例上设置断点,则我调用mBackgroundaddErrorBox属性发生了变化,因此我认为背景正在改变,但不会更新。

我尝试在invalidate()的实例上调用InputBoxView,但它仍无效。

有人有想法吗?

1 个答案:

答案 0 :(得分:3)

根据您使用您提供的代码测试,问题是

android:background="@android:color/white"

关于自定义视图xml的相对布局。它似乎忽略了您为setBackgroundResource使用InputBoxView设置的内容。

删除该属性后,我能够看到红色边框背景。

解决此问题的一个方法是从xml中删除RelativeLayout,因为InputBoxView已经从<merge xmlns:android="http://schemas.android.com/apk/res/android" > <!-- Your views in here without the RelativeLayout --> </merge> 延伸并设置了白色背景,宽度高度以及在您自定义视图时充气的情况。

所以你的xml看起来像这样

InputBoxView

并在public InputBoxView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.some_custom, this, true); // Set what you need for the relative layout. setBackgroundColor(Color.WHITE); } public void addErrorBox() { setBackgroundResource(R.drawable.error_border); invalidate(); }

InputBoxView

或者您可以向RelativeLayout添加ID并直接修改背景而不是{{1}}。

对于invalidate,你需要在onCreate之后重新绘制它。

希望这有助于解决您的问题或至少指出您正确的方向。