有没有一种方法可以递归地从布局中删除视图?函数removeAllViewsInLayout()似乎没有做任务(它从布局中删除所有视图,但不是布局的子视图)。在我的程序中,我通过RelativeLayout动态添加了一些FrameLayouts,并在这些FrameLayouts上添加了一些ImageViews和TextViews。所以我想知道如果我必须去做我自己的递归删除视图代码或者如果有一些可用的。Android - 以递归方式删除布局中的视图
回答
我认为你可以把布局看作一棵树。因此,您只需要对根节点的引用。如果您将其移除,则会将其与孩子一起收集起来,因为没有其他人会引用它们。
如果由于某种原因,您在此操作后仍然可以看到一些视图,则表示它们属于不同的节点。您可以随时使用层次浏览器“看到”您的UI更好:http://developer.android.com/guide/developing/debugging/debugging-ui.html
我认为这样做可行,但我不确定是删除根目录还是通过每个视图并删除它们。也许这种或那种方式有一些窍门。但是由于似乎没有,所以你的答案是:D – Alesqui
它不是一个递归的例子,但我认为,它可以解决你的问题:
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并且理解了查看测量和布局管线“。 – osundblad
我认为你可以做得更好,而不是检查'instanceof FrameLayout',你可以检查'instanceof ViewGroup'。你会看到其他的布局('LinearLayout','GridLayout'等) –
首先,通常你应该打电话removeAllViews()
而不是removeAllViewsInLayout()
阅读JavaDoc的差异。
这些函数都不是递归的,它们只是从它所调用的对象中移除视图。子结构不会改变。这可能会导致问题甚至内存泄漏,如果它们引用了保存的其他对象。
例如,如果您有以下结构:
<LinearLayout id='top'>
<LinearLayout id='sub'>
<Button id='b'/>
</LinearLayout>
</LinearLayout>
和top
调用removeAllViews()
布局sub
仍然指向b
(和b
将把sub
父)。这意味着您不能在其他位置重新使用b
,而无需先将其移除(sub
)。如果你这样做,你会得到一个例外。
但是布局'sub'和所有的孩子都被垃圾收集了吗?我一直在试图找到答案,我希望是的,因为没有别的东西会引用'sub'。 –
它应该是因为它们没有外部引用,但我不知道(写得很糟糕的gc可能会离开它们,或者可能还有其他一些Android的隐藏引用) – osundblad
- 1. 以递归方式删除属性
- 2. 拖放从布局中删除视图
- 3. 从视图中删除主布局(MVC2)
- 4. 无法从布局中删除视图
- 5. 如何以编程方式在Android中隐藏布局/视图
- 6. Android:以编程方式添加和删除布局
- 7. 以非递归方式删除BST中的节点
- 8. Android:以编程方式更改布局根视图的高度
- 9. 以递归方式读取android中的递归json对象?
- 10. 布局中的Android视图
- 11. 以递归方式删除文件夹时排除文件
- 12. 以编程方式删除Sitecore中的子布局
- 13. 以递归方式从JSON结构中删除空值
- 14. Android:以编程方式在布局视图上绘制形状
- 15. 以编程方式将视图添加到相对布局Android
- 16. 以图形方式布局滚动视图(页面视图)
- 17. 以编程方式在布局中布置子视图
- 18. 以编程方式从android中的图像视图中删除背景图片
- 19. 以非递归方式删除二叉树的问题
- 20. 以递归方式删除指定数据的链接列表
- 21. 以递归方式查找空文件夹并递归删除它们
- 22. 以编程方式从自定义布局中删除ImageView
- 23. 从表格布局中删除视图,但android中的标题除外?
- 24. 删除android布局marging
- 25. Android删除布局充气
- 26. LinearLayout中的布局视图以编程方式
- 27. 传递从视图中的变量布局的局部视图
- 28. 删除递归
- 29. 递归删除
- 30. 动态删除android中的布局?
您是否尝试删除FrameLayouts而不是TextViews/ImageViews,然后回滚到FrameLayout? – Rob
如果我经历过每一次查看你说的方式,它的工作原理(这就是我所做的)。所以我只是想知道,如果这是一个为我工作的功能,或者我必须自己做。 – Alesqui