(Android/안드로이드) 키보드(IME) 올라올 때 화면이 밀리거나 버튼이 가려질 때

✨ 개요

안드로이드에서 시스템 키보드(IME)가 올라오면 화면이 “밀리거나”, “특정 버튼이 가려지거나”, “레이아웃이 튄다”는 문제가 매우 흔합니다.

이런 문제는 대부분 windowSoftInputMode 설정(그리고 IME Insets 대응)으로 해결합니다.


1. 요약


2. windowSoftInputMode란?

키보드가 표시될 때 Activity의 Window가 어떻게 반응할지 정하는 옵션입니다.

설정 위치는 대표적으로 두 군데입니다.

2.1 AndroidManifest.xml에서 설정

<activity
    android:name=".LoginActivity"
    android:windowSoftInputMode="adjustResize" />

2.2 코드에서 설정 (런타임)

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

주의: 일부 상황에서는 런타임 변경이 즉시 적용되지 않거나 화면 재구성이 필요할 수 있습니다. 가능하면 Manifest에서 명확히 설정하는 편이 안정적입니다.


3. 핵심 옵션 3종: RESIZE / PAN / NOTHING

3.1 SOFT_INPUT_ADJUST_RESIZE (가장 많이 씀)

3.2 SOFT_INPUT_ADJUST_PAN

3.2 SOFT_INPUT_ADJUST_NOTHING


4. 옵션 선택 기준(실무 체크리스트)


5. WindowInsets로 키보드에 맞춰 버튼 올리기 adjustNothing + IME 인셋 처리

하단 버튼이 키보드에 가리지 않게 “버튼만” 올리고 싶을 때 가장 좋은 방법입니다.

import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding

fun applyImePadding(bottomBar: View) {
    ViewCompat.setOnApplyWindowInsetsListener(bottomBar) { v, insets ->
        val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
        val navInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars())

        // 키보드가 올라오면 ime bottom이 커지고,
        // 내려가면 0에 가까워짐
        val bottom = maxOf(imeInsets.bottom, navInsets.bottom)

        v.updatePadding(bottom = bottom)
        insets
    }
}

// 하단 버튼 컨테이너(예: bottomBar)가 있다고 가정
applyImePadding(binding.bottomBar)


Related Posts