有没有一种方法可以递归地从布局中删除视图?函数 removeAllViewsInLayout() 似乎无法完成此任务(它会从布局中删除所有视图,但不会删除布局的子视图)。在我的程序中,我动态添加了一些FrameLayouts到RelativeLayout上,并在这些FrameLayouts上添加了一些ImageViews和TextViews。所以我想知道是否需要编写自己的递归删除视图代码,还是有一些可用的方法。
这不是一个递归示例,但我相信它可以解决你的问题:
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();
}
FrameLayout
时将其清除。removeAllViews()
而不是removeAllViewsInLayout()
。后者的JavaDoc中写道:“除非你正在扩展ViewGroup并且了解视图测量和布局流程,否则不要调用此方法。” - osundbladinstanceof FrameLayout
,你可以检查 instanceof ViewGroup
。这样你就可以捕获其他布局(LinearLayout
、GridLayout
等)。 - Ehtesh Choudhury首先,通常应该调用 removeAllViews()
而不是 removeAllViewsInLayout()
,请阅读JavaDoc以了解它们之间的区别。
另外,这些函数都不是递归的,它们只会从调用它们的对象中删除视图。子结构不会改变。如果子结构引用了其他被保留的对象,则可能会导致问题甚至内存泄漏。
例如,如果您拥有以下结构:
<LinearLayout id='top'>
<LinearLayout id='sub'>
<Button id='b'/>
</LinearLayout>
</LinearLayout>
如果在布局top
上调用removeAllViews()
,那么布局sub
仍将引用b
(并且b
将引用sub
作为其父级)。这意味着您不能在没有先删除其父级(sub
)的情况下在其他地方重用b
。如果这样做,您将会得到一个异常。
sub
及其所有子元素是否会被垃圾回收呢?我一直在尝试找到答案,希望是肯定的,因为没有其他东西会引用sub
。 - Tony Chan