Czy istnieje sposób na usunięcie rekurencyjnie widoków z układu? Wydaje się, że funkcja removeAllViewsInLayout() nie wykonuje tego zadania (usuwa wszystkie widoki z układu, ale nie widoki podrzędne układu). W moim programie dodam niektóre FrameLayouts dynamicznie przez RelativeLayout, a nad tymi FrameLayouts dodam niektóre ImageViews i TextViews. Więc chcę wiedzieć, czy będę musiał zrobić własny kod rekurencyjny, usuwając kod widoku, czy też jest dostępny.Android - usuwa widoki w układzie rekurencyjnie
Odpowiedz
Myślę, że można uznać układ za drzewo. Dlatego potrzebujesz tylko odniesienia do węzła głównego. Jeśli go usuniesz, zostanie on zebrany wraz z jego dziećmi, ponieważ nic innego nie odwołuje się do nich.
Jeśli z jakiegoś powodu nadal widzisz niektóre widoki po tej operacji, oznacza to, że należały do innego węzła. Zawsze można użyć Hierarchy Viewer „zobaczyć” Twój UI lepiej: http://developer.android.com/guide/developing/debugging/debugging-ui.html
Myślałem, że to zadziała, ale nie byłem pewien, czy usunąć root, czy przejść przez każdy widok i je usunąć. Może był jakiś trik w taki czy inny sposób. Ale ponieważ wydaje się, że nie ma, twoja odpowiedź brzmi: D – Alesqui
To nie jest rekurencyjny przykład, ale wierzę, że można go rozwiązać swój problem:
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();
}
zamiast używać rekurencji, tylko pętli każdego dziecka i wyczyścić go, jeśli jest to FrameLayout
Nie powinien wywoływać 'removeAllViews()' zamiast 'removeAllViewsInLayout()' JavaDoc z tego ostatniego "Nie wywołuj tej metody, chyba że rozszerzasz ViewGroup i rozumiesz zobacz pipeline pomiarowy i układowy. " – osundblad
Myślę, że możesz zrobić jeden lepszy i zamiast sprawdzać 'instanceof FrameLayout', możesz sprawdzić' instanceof ViewGroup'. Złapiesz inne układy ('LinearLayout',' GridLayout', itp.) –
po pierwsze, zazwyczaj należy zadzwonić removeAllViews()
zamiast removeAllViewsInLayout()
przeczytać javaDoc dla różnicy.
Również żadna z tych funkcji nie jest rekurencyjna, jedynie usuwa widoki z obiektu, do którego jest wywoływana. Podstruktury się nie zmienią. Może to powodować problemy, a nawet wycieki pamięci, jeśli mają odniesienia do innych obiektów, które są przechowywane.
Na przykład jeśli mają następującą strukturę:
<LinearLayout id='top'>
<LinearLayout id='sub'>
<Button id='b'/>
</LinearLayout>
</LinearLayout>
i nazywają removeAllViews()
na top
układ sub
będzie nadal odnoszą b
(i b
skieruje sub
jako rodzica). Oznacza to, że nie można ponownie użyć numeru b
w innym miejscu bez uprzedniego usunięcia go nadrzędnego (sub
). Jeśli to zrobisz, otrzymasz wyjątek.
Ale czy układ "sub" i wszystkie jego dzieci będą zbierane ze śmieci? Próbowałem znaleźć odpowiedź na to i mam nadzieję, że tak, ponieważ nic innego nie będzie odwoływać się do "sub". –
Powinny, ponieważ nie mają zewnętrznych odniesień, ale nie wiem, że (źle napisane gc może je opuścić, lub może jest jakieś inne ukryte odniesienie przez Androida) – osundblad
- 1. Jak wyśrodkować dwa widoki we względnym układzie?
- 2. Jak mogę wyśrodkować dwa widoki tekstowe w układzie pionowym w układzie
- 3. Jak buforować widoki w systemie Android?
- 4. Wiele listview w jednym układzie android
- 5. Android scrollview ukrywa najwyższą zawartość w układzie
- 6. Prawa kolumna w układzie tabeli Android
- 7. Android - Używanie niestandardowej SurfaceView w układzie XML
- 8. Android VectorDrawable nie pojawia się w układzie
- 9. Jak utworzyć stałą stopkę w układzie Android?
- 10. Android scrollview usuwa niebieskie światło
- 11. fitsSystemWindows usuwa wyściółka
- 12. Jak usuwać pliki rekurencyjnie
- 13. Poziomo w środku Widoki wewnątrz Android GridLayout
- 14. Zdobądź pozycję widoku obrazu na układzie android
- 15. Jak zaktualizować widoki systemu Android po modyfikacjach?
- 16. Dlaczego Android aapt usuwa rozszerzenie plików .gz?
- 17. Android i RoboGuice - Inject widoki fragmentu?
- 18. android edittext usuwa fokus po kliknięciu przycisku
- 19. Android: Jak znaleźć widoki według typu
- 20. Jak dynamicznie dodawać widoki do RelativeLayout już zadeklarowanego w układzie xml?
- 21. Przycisk równomiernie rozmieszczony w układzie
- 22. marże android nie działa, gdy dynamicznie wstawiać widoki
- 23. Android: Dodaj programowo dwa widoki tekstowe
- 24. Jak umieścić jeden widok na innych w układzie względnym programowo w systemie Android?
- 25. TransitionFromView usuwa poprzedni widok
- 26. Automatyczne dopasowanie do rozmiaru ekranu w układzie siatki Android
- 27. Ustaw Tytuł i Podtytuł w układzie CollapsingToolBar Android
- 28. Układ systemu Android lewa i prawa wyrównania w układzie poziomym
- 29. jak wyrównać nadrzędne dno w układzie liniowym Android?
- 30. Jak rozciągać/skalować obrazy tła w układzie liniowym systemu Android?
Czy próbowałeś po prostu usunąć FrameLayouts zamiast TextViews/ImageViews, a następnie powrócić do FrameLayout? – Rob
Jeśli przejdę przez każdy widok tak, jak mówisz, działa (i to właśnie robię). Chciałem tylko wiedzieć, czy to funkcja, która wykonuje to zadanie dla mnie, czy też muszę to zrobić sam. – Alesqui