findViewById 如何在具有自定义视图中的许多 ID 的多层次结构树上工作?

How does findViewById works on a multi hierarchy tree with many IDs from a Custom View?

我有一个非常复杂的视图,其中包含许多层次结构。在其中,我有一个名为 ExpandableText 的 CustomView,其中我有一个 RelativeLayout 和一个 TextView,其中 ID "expandable_text"。

在我的主视图中,我使用以下代码创建了多个 ExpandableView 实例:

<include layout="@layout/expandable_text"
         android:id="@+id/expandable1"
/>
<include layout="@layout/expandable_text"
         android:id="@+id/expandable2"
/>
<include layout="@layout/expandable_text"
         android:id="@+id/expandable3"
/>

这些 ExpandableView 在 LinearLayout 中。在某些时候,我得到了对 LinearLayout 的引用,并希望在我的自定义视图中访问所有三个 expandable_texts。

在这种情况下,findViewById() 是如何工作的?

我的意思是,我的层次结构基本上是:

ParentViews... > LinearLayout > 3 ExpandableViews > RelativeLayout > TextView

其中这些 TextView 具有相同的 ID,而每个 ExpandableView 具有不同的 ID。

我查看了 google 并没有找到这个 DOM 结构的工作原理。来自 Android Developer:

View IDs need not be unique throughout the tree, but it is good practice to ensure that they are at least unique within the part of the tree you are searching.

关于这个 topic 有人说:

It's not random at all. findViewById() is a depth-first search algorithm; it will return the first view of the specified id it can find.

是否正确?我的意思是,我创建这个主题基本上是出于对 Android "DOM traversing" 是如何工作的好奇,如果有人能澄清这一点,我将不胜感激。

Is it correct?

是的,这就是它的工作方式。它会在第一个可扩展视图中找到 TextView。要缩小范围,在这种情况下,您首先要做的是找到唯一的可扩展行,然后从 that 视图中查找 TextView。例如,假设您的 TextView 的 ID 是 my_textview 并且您想在第二行中找到该视图:

View expandedRow2 = findViewByid(R.id.expandable2);
TextView textView2 = (TextView) expandedRow2.findViewById(R.id.my_textview);