Android ViewTreeObserver

Chance·2022년 12월 8일

ViewTreeObserver

  • View의 높이를 구하기 위해 onCreate에서 getHeight(), getMesasuredHeight를 호출하면 0을 반환한다.
  • 왜냐하면, View가 아직 화면에 그려지기 이전에 호출했기 때문이다.

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 윈도우 포커스 변경 시

0개의 댓글