探索Android中的视图树

问题描述 投票:0回答:1

这也许有点抽象,但我想知道,如果你们中的一些有一个体面的解决这一问题:

我有一个复杂的布局,我需要找到某种类型的视图的所有实例。

我有几个解决方案,但我觉得他们都不完美,我想知道是否有另一种方式或改进它们的方法。

我的第一个选项

我们可以在getChildCount()getChildAt()视图树遍历,然后用instanceof检查像很多SO答案。

for (int i = 0; i<parentContainer.getChildCount(); i++){
    View child = getChildAt(i);
    if (child instanceof BlaBla){
        // Do something wonderful
    }
}

因为我在很多地方这些情况下,特别是在嵌套的地方,所以我需要让这个方法递归这是非常低效的。

我的第二个选项

这将是动态的标签或标识和使用findViewByIdfindViewWithTag工作。但问题是,它使更多的东西来配置和一如既往它使软件更加复杂。

所以我的问题是:我该怎么办视图树一个完整的搜索,以便找到一个组件的所有实例没有做搜索自己(因为这将是可能是非常低效的)?这个现象的原因可能吗?

android android-view
1个回答
1
投票

所以,我不知道第二个选项是可能的,在这种情况下,你需要创建在运行时,这个意见,并与一些位掩码分配一些生成的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。

© www.soinside.com 2019 - 2024. All rights reserved.