Android SDK 36 대응 - Edge-to-edge 예외 설정이 더 이상 동작하지 않는 이유와 해결 방법
Android SDK 36 대응 - Edge-to-edge 예외 설정이 더 이상 동작하지 않는 이유와 해결 방법
Android SDK 35에서 SDK 36으로 마이그레이션하면서 가장 먼저 확인했던 부분 중 하나는 Edge-to-edge 설정이었다.
처음에는 Android 16에서 Edge-to-edge가 새롭게 적용되는 줄 알았지만, 공식 문서를 다시 확인해 보니 실제 변경 사항은 조금 달랐다.
Edge-to-edge 자체는 이미 Android 15(API 35)부터 기본 적용되었다.
Android 16(API 36)에서는 Edge-to-edge를 임시로 비활성화하기 위해 사용하던 예외 설정이 더 이상 동작하지 않는다.
이번 글에서는 이 변경 사항이 무엇인지, 어떤 프로젝트가 영향을 받는지, 그리고 어떻게 대응해야 하는지 정리해 보려고 한다.
Edge-to-edge는 SDK 36에서 새롭게 추가된 기능이 아니다
많은 글에서 “Android 16부터 Edge-to-edge가 적용된다”고 설명하지만, 이는 정확하지 않다.
실제로 Edge-to-edge는 Android 15(API 35) 에서 targetSdkVersion 35 이상을 대상으로 기본 적용되었다.
즉
- Android 14 이하 → 기존 방식
- Android 15(API 35) → Edge-to-edge 기본 적용
- Android 16(API 36) → 기존 예외 설정 제거
이것이 가장 큰 차이점이다.
문제가 되는 설정은 무엇인가?
Android 15 대응 당시 많은 프로젝트에서는 Theme에 다음 속성을 사용하여 기존 화면을 유지했다.
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>이 설정을 사용하면 Window Insets 처리를 하지 않아도 기존처럼 화면을 표시할 수 있었다.
예를 들면
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowOptOutEdgeToEdgeEnforcement"
tools:targetApi="35">true</item>
</style>
하지만 Android 16에서는 이 속성이 무시된다.
즉,
설정은 존재하지만 더 이상 효과가 없다.
어떤 프로젝트가 영향을 받을까?
다음과 같은 프로젝트라면 영향을 받을 가능성이 높다.
- Android 15 대응을 급하게 진행한 프로젝트
- WindowInsets 처리를 아직 하지 않은 프로젝트
- Toolbar가 상태바와 겹치는 프로젝트
- 하단 버튼이 Navigation Bar에 붙어있는 프로젝트
- Dialog 또는 BottomSheet를 많이 사용하는 프로젝트
반대로 Android 15 대응 과정에서 WindowInsets 처리를 완료했다면 추가 수정은 거의 필요하지 않다.
실제로 발생하는 현상
예외 설정이 무시되면 다음과 같은 문제가 발생할 수 있다.
상태바와 Toolbar가 겹친다.
상단 AppBar가 상태바 아래로 들어간다.
하단 버튼이 Navigation Bar에 가려진다.
저장 버튼이나 확인 버튼이 Navigation Bar 뒤에 숨는다.
키보드가 입력창을 가린다.
Insets 처리를 하지 않았다면 EditText가 보이지 않을 수도 있다.
Dialog 위치가 어색해진다.
BottomSheet와 Dialog도 Insets 처리가 필요할 수 있다.
어떻게 확인하면 될까?
가장 쉬운 방법은 프로젝트 전체에서 다음 키워드를 검색하는 것이다.
windowOptOutEdgeToEdgeEnforcement검색 결과가 나온다면 해당 화면은 Android 16에서 다시 테스트하는 것이 좋다.
권장하는 대응 방법
현재 Google이 권장하는 방법은 Window Insets를 사용하는 것이다.
예를 들어 Activity에서는 다음과 같이 Insets를 적용할 수 있다.
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
ViewCompat.setOnApplyWindowInsetsListener(rootView, (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(
systemBars.left,
systemBars.top,
systemBars.right,
systemBars.bottom
);
return insets;
}); ...}이렇게 하면 상태바와 Navigation Bar의 크기에 맞춰 레이아웃이 자동으로 조정된다.
실무에서는 어떻게 대응했나?
이번 SDK 36 대응에서는 우선 프로젝트 전체에서 windowOptOutEdgeToEdgeEnforcement를 검색했다.
다행히 대부분의 화면은 Android 15 대응 당시 이미 WindowInsets 기반으로 수정되어 있었고, 일부 레거시 화면만 추가 수정이 필요했다.
특히 WebView 화면과 일부 Dialog는 실제 기기에서 확인하는 것이 중요했다.
테스트할 항목
Android 16으로 변경했다면 다음 항목을 반드시 확인하는 것을 추천한다.
- Toolbar가 상태바와 겹치지 않는가?
- 하단 버튼이 Navigation Bar에 가려지지 않는가?
- 키보드 표시 시 입력창이 정상적으로 보이는가?
- Dialog가 화면 밖으로 밀리지 않는가?
- BottomSheet가 정상적으로 표시되는가?
- WebView 화면이 잘리지 않는가?
마무리
Android SDK 36에서 새롭게 Edge-to-edge가 적용되는 것은 아니다.
진짜 변경 사항은 Android 15에서 임시로 사용할 수 있었던 예외 설정이 Android 16에서는 더 이상 동작하지 않는다는 점이다.
따라서 SDK 36으로 마이그레이션하는 프로젝트라면 먼저 windowOptOutEdgeToEdgeEnforcement 사용 여부를 확인하고, Window Insets 기반으로 레이아웃을 구성했는지 점검하는 것이 가장 중요하다.
다음 글에서는 실제 프로젝트에서 Activity와 Fragment에 Window Insets를 적용하는 방법을 코드 예제와 함께 자세히 정리해 보겠다.
댓글
댓글 쓰기