在包含的XML中引用子视图

时间:2012-11-23 18:12:31

标签: android layout include

我知道我可以使用include / merge将XML文件包含在另一个XML文件中。如果包含的布局包含子项,并且您在根视图中包含了多个这样的实例,那么如何找到每个子实例的ID?

例如,如果包含的布局包含列表视图,并且您在根布局中包含此布局的3个实例,那么如何查找和引用3个listview子项?

更新: 对于那些阅读这个主题的人来说:实际上我找到了一个更好的解决方案,回想起来它非常明显。 getChildAt()的问题在于,如果添加新视图或重新排列内容,此代码将崩溃或无法工作,因为子代的索引已更改,并且类类型可能甚至不再匹配。所以不太可维护。事实证明,如果你只是深入钻取布局并且你给每个包括一个ID,findViewById()工作正常。例如,假设您在布局中有3个包含,ID名称为“list_container1”,“list_container2”和“list_container3”。其中每个都包含具有相同ID名称的相同列表视图XML。现在,不要尝试从根布局中找到您的列表,这将无效,首先找到容器,然后找到如下列表:

myRootLayout = (LinearLayout) findViewById(R.id.root_layout);
container1 = (LinearLayout) myRootLayout.findViewById(R.id.list_container1);
list1 = (ListView) container1.findViewById(R.id.my_list_view);
container2 = (LinearLayout) myRootLayout.findViewById(R.id.list_container2);
list2 = (ListView) container2.findViewById(R.id.my_list_view);
container3 = (LinearLayout) myRootLayout.findViewById(R.id.list_container3);
list3 = (ListView) container3.findViewById(R.id.my_list_view);

在上面的例子中,布局层次结构是这样的(可以进一步简化):

LinearLayout
    <include>
        LinearLayout
            ListView
    <include>
        LinearLayout
            ListView
    <include>
        LinearLayout
            ListView

1 个答案:

答案 0 :(得分:0)

您可以使用根布局的getChildAt(int index)方法转到任何孩子。事实上findViewById()只是使用这个和getChildCount()循环遍历布局的所有子视图,直到一个匹配给定的id。


示例:

LinearLayout layout = (LinearLayout) findViewById(R.id.rootLayout);
ListView list1 = (ListView) layout.getChildAt(0);
ListView list2 = (ListView) layout.getChildAt(1);
ListView list3 = (ListView) layout.getChildAt(2);

确切的索引取决于您如何安排布局。