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

Posted

技术标签:

【中文标题】如何以编程方式删除在 XML 中定义的现有规则?【英文标题】:How do I programmatically remove an existing rule that was defined in XML? 【发布时间】:2011-07-03 17:24:42 【问题描述】:

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

    RelativeLayout.LayoutParams layoutParams;

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

但它不起作用 :o(

有什么线索吗?

【问题讨论】:

【参考方案1】:

您无法删除规则,因为所有规则始终存储在固定大小的 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);

【讨论】:

从 API 级别 17 开始,RelativeLayout.LayoutParams 类具有以下方法:public void removeRule (int verb) api级别17之前的应用怎么办? :o @marienke 将规则设置为0 类似于删除规则。【参考方案2】:

我认为您需要致电:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

更改 LayoutParams 后。

回复编辑,您可以使用以下方法创建新的 LayoutParameters:

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

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

【讨论】:

【参考方案3】:

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

linearLayoutToMove.setLayoutParams(layoutParams)

我认为这应该可以完成这项工作。如果上面的行不起作用,请尝试在上面的行之后调用linearLayoutToMove.invalidate()

【讨论】:

由于我在onCreate,我不需要调用invalidate()。

以上是关于如何以编程方式删除在 XML 中定义的现有规则?的主要内容,如果未能解决你的问题,请参考以下文章

删除以编程方式创建的部分 TreeView 节点(来自 XML)

如何使用现有 UIPageViewController 的按钮以编程方式滑动视图

TestNG:如何以编程方式运行自定义 TestNG.XML 文件

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

以编程方式将 IP 添加到 Server 2008 防火墙规则

在 Drools 6 中以编程方式创建新的 drools 规则的新接受方式是啥?