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

71

我有一个线性布局,它包含在相对布局中。XML文件设置了它在另一个线性布局的右侧(这很好用)。 某些情况下,我需要在活动的onCreate期间更改布局的相对位置,因此需要修改“向右”的参数以关联到另一个布局。 我尝试过这个:

    RelativeLayout.LayoutParams layoutParams;

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

但是它不起作用 :o(

有什么线索吗?

3个回答

155

你无法删除规则,因为所有规则都始终存储在固定大小的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 verb)。 - Roger Rapid
1
在 API 等级低于 17 的应用中,我该怎么办?:o - marienke
3
将规则设置为“0”与删除该规则类似。 - Michael

3

我认为在改变LayoutParams后,您需要调用以下代码:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

针对编辑的回复,您可以使用以下代码创建新的LayoutParams:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接