有沒有一種方法可以遞歸地從佈局中刪除視圖?函數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