我有一个非常复杂的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遍历”如何工作的好奇心而创建了这个主题,如果有人能澄清这一点,我会很感激。
答案 0 :(得分:3)
这是对的吗?
是的,这就是它的工作方式。它会在第一个可展开视图中找到TextView
。要缩小范围,在这种情况下,您要做的是首先找到唯一的可扩展行,然后从那个视图中查找TextView
。例如,假设您的TextView
的ID为my_textview
,并且您希望在第二行中找到该视图:
View expandedRow2 = findViewByid(R.id.expandable2);
TextView textView2 = (TextView) expandedRow2.findViewById(R.id.my_textview);