- 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 변경사항을 직접 감지하고 정확한 정보를 제공하므로, 더 신뢰할 수 있는 키보드 감지가 가능합니다.
느낀 점
키보드가 위로 올라갔는 지 감지하는 코드가 필요했는데, 구현완.
전에 잘 되던 코드가 안된 이유는 내가 상태바 색깔 바꾼다고 상태바랑 네비게이션 바 색깔을 바꿨었는데, 그게 원인이 된 것 같다.
'Android' 카테고리의 다른 글
[Android] jcenter 빌드 오류 (2) | 2024.11.09 |
---|---|
[Android] 토스트 메세지 디스플레이 설정 대응 (0) | 2024.11.08 |
[Android] 약간의 팁들 정리 (0) | 2024.10.15 |
[네이버 부스트캠프] 베이직 과정 START (0) | 2024.06.21 |
[Android] 2024 드로이드나이츠 - 기록하고 싶은 내용 정리 (1) | 2024.06.11 |