반응형
ViewTreeObserver
설명
- 리스너를 등록하여 View Tree 안에서의 변화를 감지할 수 있는 클래스
- 뷰가 그려지기 전/후, 포커싱 변경, 스크롤 상태 변경과 같은 이벤트를 처리할 수 있게 해준다.
종류
- ViewTreeObserver.OnPreDrawListener // 뷰가 그려지기 전
- ViewTreeObserver.OnDrawListener // 뷰가 그려질 경우
- ViewTreeObserver.OnGlobalLayoutListener // 전체 뷰가 그려진 경우
- ViewTreeObserver.OnGlobalFocusChangeListener // 전체 뷰의 포커스가 바뀔 경우
- ViewTreeObserver.OnWindowFocusChangeListener // 윈도우 포커스가 바뀔 경우
- ViewTreeObserver.OnWindowAttachListener // 뷰의 계층 구조에 추가/제거 됐을 경우
- ViewTreeObserver.OnScrollChangedListener // 스크롤 상태가 변경된 경우
- ViewTreeObserver.OnTouchModeChangeListener // 터치 모드가 변경된 경우
예제
MainActivityclass 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 |