如何以编程方式删除在 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 中删除安全区域?