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

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

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

但它不起作用:o(

任何线索?

您不能删除规则,因为所有规则总是存储在固定大小的java数组中。 但是你可以设置一个规则为0 。 例如

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

编辑 (感谢罗杰快速 ):

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

 public void removeRule(int verb) 

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

 layoutParams.removeRule(RelativeLayout.RIGHT_OF); 

你将得到和'添加'零规则完全一样的结果:

 layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); 

我想你需要打电话给:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

在更改LayoutParams之后。

在回复编辑时,您可以使用以下命令创build新的LayoutParameters:

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

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

将下面的代码添加到您现有的代码

linearLayoutToMove.setLayoutParams(layoutParams)

我认为这应该做的工作。 如果上述行不工作,请尝试在上面的行之后调用linearLayoutToMove.invalidate()