programing

forceLayout(), requestLayout() 및 invalidate() 사용

css3 2023. 10. 27. 22:08

forceLayout(), requestLayout() 및 invalidate() 사용

저는 그 역할에 대해 조금 혼란스럽습니다.forceLayout(),requestLayout()그리고.invalidate()View

그들을 언제 부를까요?

François BourliuxDalvik이 제공하는 답변을 더 잘 이해하기 위해서 Arpit Mathur의 멋진 뷰 라이프사이클 다이어그램을 살펴보시기를 권합니다.enter image description here

invalidate()

부르기invalidate()보기를 다시 그리기 스케줄을 지정할 때 수행됩니다.결과적으로onDraw결국(곧, 즉시는 아니지만) 호출됩니다.사용자 정의 보기가 호출하는 경우의 예는 텍스트 또는 배경색 속성이 변경된 경우입니다.

보기는 다시 그려지지만 크기는 변경되지 않습니다.

requestLayout()

보기가 변경되어 크기에 영향을 미칠 경우 전화를 해야 합니다.requestLayout(). 트리거됩니다.onMeasure그리고.onLayout이 보기 뿐만 아니라 상위 보기의 경우에도 줄을 이을 수 있습니다.

부르기requestLayout()(수용된 답변의 다이어그램이 의미하는 것에 대한 contrary) 결과를 보장하지 않으므로, 일반적으로 다음과 결합됩니다.invalidate().

invalidate();
requestLayout();

사용자 지정 레이블의 텍스트 속성이 변경된 경우를 예로 들 수 있습니다.라벨의 크기가 변경되므로 재측정하고 다시 그려야 합니다.

forceLayout()

가 때.requestLayout()상위 보기 그룹에서 호출되는 이 항목은 하위 보기를 재측정하고 레이아웃할 필요가 없습니다.그러나 재측정 및 레이아웃에 어린이가 포함되어야 하는 경우에는forceLayout()아이에게forceLayout()아이에 대해서만 작동합니다. 그것이 a와 함께 발생하는 경우.requestLayout()그 직계 부모에게부르기forceLayout()A를 트리거하지 않기 때문에 그 자체로는 효과가 없습니다.requestLayout()뷰 트리 위로 이동합니다.

보다 자세한 설명은 이 Q&A를 읽어 보십시오.forceLayout().

심화학습

여기서 몇 가지 답변을 보실 수 있습니다: http://developer.android.com/guide/topics/ui/how-android-draws.html

에 전화를 드리려고 합니다.invalidate()보기 및 호출만 새로 고칩니다.requestLayout()보기를 새로 고치고 화면에서 보기 크기를 계산합니다.

invalidate()--->onDraw()UI 스레드에서

postInvalidate()--->onDraw()바탕실에서

requestLayout()--->onMeasure()그리고.onLayout()그리고 꼭 그렇지는 않습니다. onDraw()

  • 중요: 이 메서드를 호출해도 호출된 클래스의 자식에게는 영향을 주지 않습니다.

forceLayout()--->onMeasure()그리고.onLayout() 직접 부모가 전화를 걸어 왔을 때만requestLayout().

다시 그릴 뷰에서 invalidate()를 사용하면 온드로(Canvasc)가 호출되고 requestLayout()이 전체 레이아웃 렌더링(측정 단계 및 포지셔닝 단계)이 다시 실행됩니다.런타임에 자식 보기의 크기를 변경하는 경우에만 사용해야 하지만 부모 보기의 제약 조건과 같은 특정한 경우에만 사용해야 합니다(부모 높이 또는 너비가 WRAP_CONTENT이므로 자식을 다시 래핑하기 전에 일치 측정).

답변은 에 대해 정확하지 않습니다.forceLayout().

코드에서 볼 수 있듯이, 보기는 단지 "릴레이아웃 필요"로 표시할 뿐이지만, 그릴레이아웃을 예약하거나 트리거하지는 않습니다.미래의 어느 시점에서 보기의 부모가 다른 이유로 배치되기 전까지는 배치가 이루어지지 않을 것입니다.

사용할 때도 훨씬 더 큰 문제가 있습니다.forceLayout()그리고.requestLayout():

당신이 전화했다고 가정해 보겠습니다.forceLayout()일견이제 전화할 때requestLayout()그 관점의 후예에서 안드로이드는 재귀적으로requestLayout()그 후손의 조상에 대해서 말입니다.문제는 당신이 전화한 뷰에서 재귀가 멈출 것이라는 것입니다.forceLayout(). 따라서 호출이 루트에 도달하지 않으므로 레이아웃 패스를 예약하지 않습니다.뷰 계층의 전체 하위 트리가 레이아웃 및 호출을 기다리고 있습니다.requestLayout()해당 하위 트리의 어떤 뷰에서도 레이아웃이 발생하지 않습니다.전화만requestLayout()그 하위 트리가 마법을 깨뜨릴 것이라는 것을 밖의 어떤 관점에서도.

다음과 같은 방법을 생각해 보겠습니다.forceLayout()(그리고 그것이 어떤 영향을 미치는지)requestLayout()코드에 그 기능을 절대 사용해서는 안 됩니다.

언급URL : https://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate