WindowInsets를 사용하지 않고 RealSize에서 SystemUI의 높이를 찾고 있다면 Chromebook에서 힘들어집니다.

한때, WindowInsets가 취급할 수 있게 되기 전, Kitkat라든지의 시대군요. 스테이터스 바의 높이나 네비게이션 바의 높이를 구하는 방법으로서, Display#getRealSize()를 사용하는 방법이 있었습니다. 이 방법은 지금도 어느 정도 통용합니다.

꽤 어려운 코드입니다 만, 높이로 간주하고 getGlobalVisibleRect() 를 탐색 막대의 높이를 본다는 것입니다.
val density = resources.displayMetrics.density
binding.root.doOnLayout {
    val rect = Rect()
    it.getGlobalVisibleRect(rect)
    val point = Point()
    windowManager.defaultDisplay.getRealSize(point)
    binding.realSize.text =
        """
        RealSize:
        StatusBar: ${rect.top / density}dp
        NavigationBar: ${(point.y - rect.bottom) / density}dp
        """.trimIndent()
}
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets ->
    window.decorView.onApplyWindowInsets(insets.toWindowInsets())
    binding.insets.text =
        """
        Insets:
        StatusBar: ${insets.systemWindowInsetTop / density}dp
        NavigationBar: ${insets.systemWindowInsetBottom / density}dp
        """.trimIndent()
    insets
}

비교를 위해 WindowInsets 값도 표시합니다.

우선은 Kitkat에서의 실행, WindowInsets를 취급할 수 있는 것은 Lollipop 이후이므로 Insets는 표시되어 있지 않습니다만, StatusBar/NavigationBar의 높이가 취해지고 있네요



Android 11에서 실행하면 WindowInsets의 값과 일치합니다.



라고 하는 것으로, 어쩌면 아직 이런 코드가 남아 있는 어플도 있을지도 모르겠네요.

이제 Chromebook에서 실행해 봅시다.




네, 디스플레이의 RealSize는 물리 디스플레이의 크기이지만, 앱 영역은 윈도우화되어 있으므로 GlobalVisibleRect는 윈도우 내에서의 영역 정보라는 것으로, 디스플레이 사이즈로부터 윈도우의 컨텐츠 영역의 높이를 뺀 값으로 매우 큰 값입니다.

라고 하는 것으로, 제대로 WindowInsets사용하라는 이야기였습니다.

좋은 웹페이지 즐겨찾기