以编程方式检查视图是否包含特定布局?

programmatically check if view includes specific layout?

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

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

我可以遍历 layout.xml 的所有 children,但我不知道如何检测 child 是否包含在此处或 section.xml不是。我知道我可以尝试为 section.xml 设置唯一 ID 并检查 layout.xml 的 children 的 ID,但问题是 uniqueness;因为其他开发人员可能会忘记这条规则。

Now suppose I have an inflated layout, for example layout.xml, and I want to know does it include section.xml or not?

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

I know I can try to set a unique id for section.xml

我的意思是"set a unique ID for a widget inside of section.xml"。这是您在运行时可以做的最接近您尝试实施的规则的事情。

and check ids of children of layout.xml, but the problem is the uniqueness; because other developers may forget this rule.

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

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