반응형

ViewTreeObserver

설명

  • 리스너를 등록하여 View Tree 안에서의 변화를 감지할 수 있는 클래스
  • 뷰가 그려지기 전/후, 포커싱 변경, 스크롤 상태 변경과 같은 이벤트를 처리할 수 있게 해준다.

종류

  • ViewTreeObserver.OnPreDrawListener // 뷰가 그려지기 전
  • ViewTreeObserver.OnDrawListener // 뷰가 그려질 경우
  • ViewTreeObserver.OnGlobalLayoutListener // 전체 뷰가 그려진 경우
  • ViewTreeObserver.OnGlobalFocusChangeListener // 전체 뷰의 포커스가 바뀔 경우
  • ViewTreeObserver.OnWindowFocusChangeListener // 윈도우 포커스가 바뀔 경우
  • ViewTreeObserver.OnWindowAttachListener // 뷰의 계층 구조에 추가/제거 됐을 경우
  • ViewTreeObserver.OnScrollChangedListener // 스크롤 상태가 변경된 경우
  • ViewTreeObserver.OnTouchModeChangeListener // 터치 모드가 변경된 경우

예제

MainActivity
class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "[DEBUG]"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button = findViewById<Button>(R.id.button)

        Log.d(TAG, "button width - ${button.width}") // button width - 0

        button.viewTreeObserver.addOnGlobalLayoutListener(ButtonGlobalLayoutListener(button))
    }

    inner class ButtonGlobalLayoutListener(private val button: Button) : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            Log.d(TAG, "button width - ${button.width}") // button width - 1080

            // 이벤트 발생 후 제거해주지 않으면 콜백 메소드가 여러번 호출되는 현상 발생
            button.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    }
}

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] Chromecast  (0) 2021.02.16
[Android] ExoPlayer  (0) 2021.02.10
[Android] LifecycleObserver  (0) 2021.02.10
[Android] BuildConfig  (0) 2021.02.09
[Android] meta-data  (0) 2021.02.09

+ Recent posts