본문 바로가기
Android

[Android] 키보드 높이 알아내기

by 박매트 2024. 11. 4.
  1. WindowInsets란?
  • 시스템 UI(상태바, 네비게이션바), IME(키보드), 커튼(스크린 상단 당겨서 나오는 알림창) 등이 차지하는 화면 공간에 대한 정보를 제공하는 객체입니다.
  • 화면에서 실제 앱이 사용할 수 있는 영역이 변경될 때마다 시스템이 새로운 WindowInsets 객체를 생성해서 전달합니다.

 

새로운 방식

ViewCompat.setOnApplyWindowInsetsListener(view) { view, windowInsets ->
    // windowInsets.getInsets(Type.ime())
    // → 키보드가 차지하는 공간의 크기를 반환
    // (left, top, right, bottom 값을 가진 Insets 객체)
    val imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime())
    
    // systemBars도 마찬가지로 상태바, 네비게이션바가 차지하는 
    // 공간의 크기를 반환
    val systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
    
    // imeInsets.bottom이 0보다 크다는 것은
    // 키보드가 화면 하단에서 공간을 차지하고 있다는 의미
    isKeyboardShow = imeInsets.bottom > 0
    
    WindowInsetsCompat.CONSUMED  // 이벤트 소비 완료
}

 

순서

[사용자 동작] → [시스템 UI 변경] → [WindowInsets 생성] → [OnApplyWindowInsetsListener 호출]

 

예시: EditText 클릭 → 키보드 표시 → 새로운 WindowInsets 생성 → 리스너에서 imeInsets 값 변경 감지

 

 

기존 방식

// 기존 방식 (Rect 사용)
view.getWindowVisibleDisplayFrame(rect)
val diff = screenHeight - rect.bottom
isKeyboardShow = diff > screenHeight * 0.15

// WindowInsets 방식
val imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime())
isKeyboardShow = imeInsets.bottom > 0

 

 

차이점

 

기존 방식

  • 전체 화면과 보이는 영역의 차이를 계산
  • 임의의 비율(15%)로 키보드 표시 여부 추측
  • 부정확할 수 있음

WindowInsets 방식

  • 시스템이 직접 키보드 크기 정보 제공
  • 추측이 아닌 실제 값 사용
  • 더 정확하고 신뢰성 있음

결론 

: 이런 방식으로 WindowInsets는 시스템 UI 변경사항을 직접 감지하고 정확한 정보를 제공하므로, 더 신뢰할 수 있는 키보드 감지가 가능합니다.

 
느낀 점
키보드가 위로 올라갔는 지 감지하는 코드가 필요했는데, 구현완.
전에 잘 되던 코드가 안된 이유는 내가 상태바 색깔 바꾼다고 상태바랑 네비게이션 바 색깔을 바꿨었는데, 그게 원인이 된 것 같다.