example)
image_view.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
println(image_view.height)
image_view.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
옵저버 리스너를 등록한 후 변경 감지를 1회만 할 경우 반드시 추가해준 리스너를 제거해야 한다.
아니면 무한 리스너 호출이 발생
리스너 제거 = removeOnGlobalLayoutListener()
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
getWindow().getDecorView().getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
}
private ViewTreeObserver.OnPreDrawListener mPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getWindow().getDecorView().getViewTreeObserver().removeOnPreDrawListener(this);
onLayoutCompleted();
return false;
}
};
Listener 용도
ViewTreeObserver.OnDrawListener 뷰를 그릴 때
ViewTreeObserver.OnGlobalFocusChangeListener 전체 뷰의 포커스가 바뀔 때
ViewTreeObserver.OnGlobalLayoutListener 전체 뷰가 그려질 때
ViewTreeObserver.OnPreDrawListener 뷰가 그려지기 전
ViewTreeObserver.OnScrollChangedListener 스크롤 상태의 변경 시
ViewTreeObserver.OnTouchModeChangeListener 터치 모드 변경 시
ViewTreeObserver.OnWindowAttachListener 뷰의 계층 구조에 붙을 때와 떨어져 나갈 때
ViewTreeObserver.OnWindowFocusChangeListener 윈도우 포커스 변경 시