如何以编程方式删除XML中定义的现有规则?


70

我有一个包含在相对布局内的线性布局。在XML文件中将其设置为在另一个线性布局的右侧(可以正常工作)。在某些情况下,我想在活动的onCreate期间更改布局的相对位置,因此我需要修改参数的“右侧”以与另一个布局相关。我尝试了这个:

    RelativeLayout.LayoutParams layoutParams;

    layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove
            .getLayoutParams();
    layoutParams.addRule(RelativeLayout.RIGHT_OF,
            R.id.new_ref_LinearLayout);

但这不起作用:o(

有什么线索吗?

Answers:


151

您无法删除规则,因为所有规则始终存储在固定大小的java数组中。但是您可以将规则设置为0。例如

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout);

编辑(感谢Roger Rapid):

从API级别17开始,该类RelativeLayout.LayoutParams具有以下方法:

public void removeRule(int verb) 

因此,您可以使用以下代码行删除规则:

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

您将获得与“添加”零规则的结果完全相同的结果:

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);

6
从API级别17开始,类RelativeLayout.LayoutParams具有以下方法:public void removeRule(int动词)
Roger Rapid

1
对于api级别17之前的应用程序我该怎么办?:o
marienke

3
@marienke将规则设置0为类似于删除规则。
Michael

3

我认为您需要致电:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

更改LayoutParams之后。

作为对编辑的答复,可以使用以下命令创建新的LayoutParameters:

LinearLayout.LayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.FILL_PARENT);

然后添加新规则。然后,使用前面提到的updateViewLayout()方法更新布局参数。


0

将以下代码添加到现有代码中

linearLayoutToMove.setLayoutParams(layoutParams)

我认为这应该做的。如果以上线路不起作用,请尝试linearLayoutToMove.invalidate()在上述线路之后致电。


由于我处于onCreate中,因此不需要调用invalidate()。
Regis St-Gelais
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.