2012-08-14 4 views
42

동적으로 선형 레이아웃을 채 웁니다. 응답에 따라 과거의 하위 뷰를 지우고 새로운 뷰를 만들어야합니다. 나는이 문서를 읽었지만 몇 가지 방법과 여전히 혼동된다. 모두 같은 기능을한다. 어떤 기능을 사용해야합니까?removeAllViews()와 removeAllViewsInLayout()의 차이점

+0

같은 질문은 여기에 있습니다. 다른 선형 레이아웃에 getview의 선형 레이아웃을 추가합니다. RemoveAllViewsInLayout() RemoveAllViewsInLayout() 대신 사용하여 추가 된 linearlayout 갑자기 사라지고 (및 스크롤 후 0_o) – Boy

답변

18

removeAllViews() :이 메소드를 사용하여 ViewGroup에서 모든 자식 뷰를 제거합니다. removeAllViewsInLayout() : ViewGroup 하위 클래스에 의해 호출되어 자식 뷰를 자식 뷰에서 제거합니다. 먼저 자식 뷰를 화면에 표시해야만 렌더링 할 자식 뷰의 수를 계산할 수 있습니다.

건배! 그래서 당신은, 당신은뿐만 아니라 removeAllViews()를 사용할 수있는 사용자가 선택한 한 번에 invalidate()를 호출하고 자신에게 비트를 저장하지 않으려면

public void removeAllViews() { 
    removeAllViewsInLayout(); // Details implemented here 
    requestLayout(); 
    invalidate(true); 
} 

:

는 소스에서 찾고, 많은 차이
+5

그게 진흙처럼 분명히 말하는 문서의 멋진 버전입니다. View 자체 (LinearLayout과 같은) 자체적으로 하위 뷰를 제거하는 ViewGroup 하위 클래스가 아닌가? 그리고 얼마나 많은 자식 뷰를 렌더 할 지 계산하기 전에 뷰가 먼저 화면의 크기를 알아야 하는지를 어떻게 알 수 있습니까? –

8

음이없는 타이핑.

편집
자세한 내용은 David Lui 님의 답변을 참조하십시오. 요약하면보기를 만드는 과정에 있지 않는 한 removeAllViews()을 사용합니다.이 경우에는 removeAllViewsInLayout()이라고 부릅니다.

12

Scott Biggs가 지적했듯이, 그 차이는 큰 것이 아닙니다. 유일한 차이점은 removeAllViews()requestLayout()invalidate()입니다. 이 차이가 왜 중요한 이유는 removeAllViewInLayout()이라는 이름을 이해하는 것입니다. 혼란스럽게도 그 의미는 "이 뷰 레이아웃 내의 모든 뷰를 제거하는 것이 아닙니다."

If we look at the similar method, removeViewInLayout(), we can understand what it's supposed to mean:

레이아웃 동안보기를 제거합니다. onLayout() 메서드에서 더 많은 뷰를 제거해야하는 경우 유용합니다.

따라서 removeAllViewsInLayout()은 실제로 모든보기를 삭제하는 것을 의미하며 레이아웃 통과 (즉, onLayout()) 중에이 메소드를 호출합니다. 따라서 removeAllViewsInLayout()requestLayout()으로 전화를 걸지 않습니다. 현재 이미 레이아웃 패스에 있다고 가정하기 때문에 다른 레이아웃 패스를 요청하는 것은 불필요합니다.

removeAllViewsInLayout()을 사용하는 경우 레이아웃 패스 중에 전화 하시거나 필요에 따라 requestLayout()invalidate() 번으로 전화하시는 것은 사용자의 책임입니다.

+0

와우, 깊은 설명 주셔서 감사합니다! 아마도 그들은 전치사 _in_의 모호한 사용을 피하기 위해'removeAllViewsDuringLayoutConstruction()'을 호출했을 것입니다. 아마도 약간의 문서가 도움이되었을 것입니다. Nahh, 완전한 프로그래머에게 심장 마비를 줄 것이라고. :) –