所有
我有一个自定义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
的实例上设置断点,则我调用mBackground
后addErrorBox
属性发生了变化,因此我认为背景正在改变,但不会更新。
我尝试在invalidate()
的实例上调用InputBoxView
,但它仍无效。
有人有想法吗?
答案 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之后重新绘制它。
希望这有助于解决您的问题或至少指出您正确的方向。