Android/Compose

[Android Compose] 바텀 시트와 시스템 네비게이션 바가 겹치는 현상 해결 방법

참깨빵위에참깨빵_ 2024. 10. 8. 20:17
728x90
반응형

바텀 시트를 만들던 도중 아래처럼 바텀 시트의 내용물들이 시스템 네비게이션 바와 겹쳐서 표시되는 현상이 일어났다.

 

 

원인은 간단했다. TextField에서 키보드를 띄우기 위해 키보드 inset을 고려해서 아래처럼 코드를 짰었다.

 

ModalBottomSheet(
    // ...
    windowInsets = WindowInsets.ime,
)

 

이렇게 하고 앱을 실행하면 위의 사진처럼 시스템 네비게이션 바와 바텀 시트 안의 내용물이 겹쳐서 표시될 수 있다.

해결하려면 아래처럼 수정하면 된다. 바텀 시트 안에서 Column을 사용하기 때문에 아래처럼 수정했음을 참고한다.

 

ModalBottomSheet(
    // ...
    windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Bottom), // 수정
) {
    Column(
        modifier = Modifier
            .padding(16.dp)
            .navigationBarsPadding(), // 추가
    )

 

이렇게 수정한 후 재실행하면 바텀 시트와 시스템 네비게이션 바가 겹치지 않는다.

 

 

이제 왜 이렇게 되는지 알아야 할 차례다. 먼저 ModalBottomSheet의 windowInsets를 아래처럼 수정했다.

 

windowInsets = WindowInsets.systemBars.only(WindowInsetsSides.Bottom),

 

이것은 시스템 네비게이션 바의 하단 부분만을 inset으로 고려한다는 뜻이다. 키보드가 표시될 때 키보드 관련 inset도 처리하려면 아래처럼 수정할 수 있다.

 

windowInsets = WindowInsets.systemBars
    .only(WindowInsetsSides.Bottom)
    .union(WindowInsets.ime)

 

그리고 Column에 navigationBarsPadding()을 추가해서 Column이 시스템 네비게이션 바 위에 위치하게 한다.

 

Column(
    modifier = Modifier
        .padding(16.dp)
        .navigationBarsPadding(),
)

 

이렇게 수정해서 바텀 시트와 시스템 네비게이션 바가 겹치지 않게 수정할 수 있었다.

반응형