Android-递归删除布局中的视图

Android-递归删除布局中的视图,android,Android,有没有一种方法可以递归地从布局中删除视图?函数removeAllViewsInLayout()似乎不执行此任务(它从布局中删除所有视图,但不删除布局的子视图)。在我的程序中,我在RelativeLayout上动态添加了一些框架布局,并在这些框架布局上添加了一些ImageView和TextView。因此,我想知道我是否必须自己做递归删除视图代码,或者如果有可用的代码。 < P>我认为你可以把布局看作树。因此,您只需要对根节点的引用。如果删除它,它将与其子项一起收集,因为没有其他内容引用它们 如果由

有没有一种方法可以递归地从布局中删除视图?函数removeAllViewsInLayout()似乎不执行此任务(它从布局中删除所有视图,但不删除布局的子视图)。在我的程序中,我在RelativeLayout上动态添加了一些框架布局,并在这些框架布局上添加了一些ImageView和TextView。因此,我想知道我是否必须自己做递归删除视图代码,或者如果有可用的代码。

< P>我认为你可以把布局看作树。因此,您只需要对根节点的引用。如果删除它,它将与其子项一起收集,因为没有其他内容引用它们


如果由于某种原因,您在此操作后仍看到一些视图,则表示它们属于不同的节点。您可以始终使用层次结构查看器更好地“查看”您的用户界面:

这不是一个递归示例,但我相信它可以解决您的问题:

public void ClearRelLayout(RelativeLayout RL){
    for(int x=0;x<RL.getChildCount();x++){
        if(RL.getChildAt(x) instanceof FrameLayout){
            FrameLayout FL = (FrameLayout) RL.getChildAt(x);
            FL.removeAllViewsInLayout();
        }
    }
    RL.removeAllViewsInLayout();
}
public void ClearRelLayout(相对位置RL){

对于(int x=0;x首先,通常应该调用
removeAllViews()
而不是
removeAllViewsInLayout()
阅读JavaDoc以了解差异

此外,这两个函数都不是递归函数,它们只从调用它的对象中删除视图。子结构不会更改。如果它们引用了保留的其他对象,这可能会导致问题,甚至内存泄漏

例如,如果您具有以下结构:

    <LinearLayout id='top'>
      <LinearLayout id='sub'>
        <Button id='b'/>
      </LinearLayout>
    </LinearLayout>


并在
top
上调用
removeallview()
,布局
sub
仍将引用
b
(并且
b
sub
引用为父级)。这意味着您不能在其他地方重用
b
,而不先将其父级删除(
sub
)。如果您这样做,您将得到一个例外。

您是否尝试过删除框架布局而不是文本视图/图像视图,然后回滚到框架布局?如果我按照您所说的方式查看每个视图,它都会工作(我就是这么做的)。因此,我只是想知道是一个函数为我完成了这项工作,还是我必须自己完成。我认为这会起作用,但我不确定是删除根还是遍历每个视图并删除它们。也许有这样或那样的技巧。但既然似乎没有,你的答案是:DShouldn it call
 removeAllViews()
而不是后者的
removeAllViewsInLayout()
JavaDoc“除非您正在扩展视图组并理解视图测量和布局管道,否则不要调用此方法。”我认为您可以做得更好,而不是检查FrameLayout的
实例
,您可以检查ViewGroup的
实例
。您将捕获其他布局(
LinearLayout
GridLayout
,等等)但是布局
sub
和它的所有子项都会被垃圾收集吗?我一直在试图找到答案,我希望答案是肯定的,因为没有其他东西会引用
sub
。应该这样,因为它们没有外部引用,但我不知道(一个写得不好的gc可能会留下它们,或者Android可能还有其他隐藏的引用)