首页 > 解决方案 > 以编程方式检查视图是否包含特定布局?

问题描述

我有一个布局section.xml和一些其他布局,其中可能包括section.xml.

现在假设我有一个膨胀的布局,例如layout.xml,我想知道它是否包含section.xml

我可以遍历 的所有孩子layout.xml,但我不知道如何检测孩子是否section.xml包含在此处。我知道我可以尝试设置一个唯一的 idsection.xml并检查 的孩子的 id layout.xml,但问题是唯一性;因为其他开发者可能会忘记这条规则。

标签: androidxmlandroid-layoutandroid-include

解决方案


现在假设我有一个膨胀的布局,例如 layout.xml,我想知道它是否包含 section.xml?

这是不可能的,以任何直接的方式。一旦布局资源膨胀,就没有布局资源本身的迹象。这既适用于直接膨胀(例如,inflate()您称之为),也适用于间接膨胀(例如,<include>在一个布局中拉入另一个布局)。

我知道我可以尝试为 section.xml 设置一个唯一的 ID

我将其解释为“为 section.xml 中的小部件设置唯一 ID”。这是您在运行时可以做的最接近的事情,类似于您尝试实施的规则。

并检查 layout.xml 的子项的 id,但问题是唯一性;因为其他开发者可能会忘记这条规则。

那么你的 ID 不够唯一。:-) 使用 diceware 想出一些其他人不会意外使用的东西,例如android:id="aquamarineBakeryUprightAnxietyPlugAlchemy". 理想情况下,在不需要从布局中的其他地方或代码中引用的小部件上使用它。

或者,实现一个 Lint 规则以在编译时检查事物。在 Lint 处理中,布局资源仍然是布局资源。因此,如果某些布局资源必须<include>您的section布局,您可以通过 Lint 规则进行确认。或者,如果某些布局资源必须不是<include>您的section布局,您也可以确认。不幸的是,编写 Lint 规则并没有很好的记录。


推荐阅读