这也许有点抽象,但我想知道,如果你们中的一些有一个体面的解决这一问题:
我有一个复杂的布局,我需要找到某种类型的视图的所有实例。
我有几个解决方案,但我觉得他们都不完美,我想知道是否有另一种方式或改进它们的方法。
我的第一个选项
我们可以在getChildCount()
和getChildAt()
视图树遍历,然后用instanceof
检查像很多SO答案。
for (int i = 0; i<parentContainer.getChildCount(); i++){
View child = getChildAt(i);
if (child instanceof BlaBla){
// Do something wonderful
}
}
因为我在很多地方这些情况下,特别是在嵌套的地方,所以我需要让这个方法递归这是非常低效的。
我的第二个选项
这将是动态的标签或标识和使用findViewById
或findViewWithTag
工作。但问题是,它使更多的东西来配置和一如既往它使软件更加复杂。
所以我的问题是:我该怎么办视图树一个完整的搜索,以便找到一个组件的所有实例没有做搜索自己(因为这将是可能是非常低效的)?这个现象的原因可能吗?
所以,我不知道第二个选项是可能的,在这种情况下,你需要创建在运行时,这个意见,并与一些位掩码分配一些生成的ID以后认出他们。如果要创建布局的意见,你将最终遍历树视图和分配这些特殊的ID是非常accends到第一种选择。
在项目中,我也有动态渲染一些意见,我做没有递归。模式是以下几点:
ArrayList<View> views = new ArrayList<>();
views.add(getWindow().getDecorView());
do {
View v = views.remove(0);
if (v instanceof ViewGroup) {
ViewGroup group = (ViewGroup) v;
for (int i = 0; i < group.getChildCount(); i++) {
views.add(group.getChildAt(i));
}
}
if (v instanceof MyCustomView) {
//do whatever you need here
}
} while(!views.isEmpty());
所以你摆脱使用递归的,并与自己的堆栈和迭代通过它替换它。该解决方案非常有效,特别是如果你可以跳过之类的ListView,RecyclerView。