Android 在包含的XML中引用子视图

Android 在包含的XML中引用子视图,android,layout,include,Android,Layout,Include,我知道我可以使用include/merge将一个XML文件包含在另一个XML文件中。如果包含的布局包含子级,并且在根视图中包含多个子级实例,那么如何查找每个子级实例的ID 例如,如果包含的布局包含listview,并且在根布局中包含此布局的3个实例,那么如何查找和引用3个listview子级 更新: 对于阅读这篇文章的人来说:实际上,我找到了一个更好的解决方案,回想起来,这是显而易见的。getChildAt的问题是,如果添加新视图或重新安排内容,此代码将崩溃或无法工作,因为子类的索引已更改,并且

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

例如,如果包含的布局包含listview,并且在根布局中包含此布局的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

可以使用根布局的方法转到任何子级。事实上,findViewById只是使用this和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);

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

为什么用实际内容替换每个包含会有所不同?问题是,所有子项都有相同的ID,因为您实际上只包含了它们3次。下面的答案是正确的。但是没有什么可以阻止您在不进行任何包含的情况下使用相同ID的3倍。这是一个ID问题,与include I Thinks无关,但是,现在我们使用数据绑定,我们可以使用binding.someCHild.someattr引用子视图吗?