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

时间:2015-02-20 18:41:56

标签: android tree

我有一个非常复杂的View,有许多层次结构。在其中,我有一个名为ExpandableText的CustomView,其中我有一个RelativeLayout和一个TextView,其中“expandable_text”为ID。

在我的主视图中,我使用代码创建了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"
/>

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

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

我的意思是,我的等级基本上是:

ParentViews ...&gt; LinearLayout&gt; 3 ExpandableViews&gt; RelativeLayout&gt; TextView的

这些TextView具有相同的ID,每个ExpandableView都有不同的ID。

我看了谷歌,但却找不到这个DOM结构的工作原理。来自Android Developer

  

视图ID在整个树中不一定是唯一的,但它很好   实践,以确保它们至少在部分内是独一无二的   你正在寻找的树。

在此topic有人说:

  

这根本不是随意的。 findViewById()是深度优先搜索   算法;它将返回它可以指定的id的第一个视图   找到。

这是对的吗?我的意思是,我基本上是出于对Android“DOM遍历”如何工作的好奇心而创建了这个主题,如果有人能澄清这一点,我会很感激。

1 个答案:

答案 0 :(得分:3)

  

这是对的吗?

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

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