이번 편의 목표: targetSdk 37에서 큰 화면의 방향 고정과 크기 고정이 무시될 때, 너비에 따라 레이아웃을 나눕니다.

작은 화면의 짧은 변이 600dp 이상이면 안드로이드 17은 그 화면을 큰 화면으로 봅니다. targetSdk가 37인 앱은 이 화면에서 screenOrientation의 세로·가로 고정, setRequestedOrientation()의 같은 고정, resizeableActivity="false", minAspectRatio와 maxAspectRatio가 무시됩니다. 안드로이드 16에서 쓸 수 있던 개발자 옵트아웃은 37에서 제거되었습니다. Play 카테고리가 게임이고 android:appCategory로 게임인 앱은 예외입니다. 사용자는 기기 설정에서 앱이 요청한 비율을 다시 선택할 수 있습니다.

휴대폰을 외부 디스플레이의 데스크톱 모드로 쓰는 경우도 같은 규칙입니다. 앱은 임의의 창 크기, 사용자가 고른 자세, 자유형 창을 받아야 합니다. 접히는 기기와 태블릿, 나중에 안드로이드 스택 위의 Googlebooks도 이 경로에 있습니다.

Compose에서는 사용 가능한 최대 너비로 목록과 상세를 나눕니다.

Kotlin
@Composable
fun LibraryScreen() {
    BoxWithConstraints {
        if (maxWidth < 600.dp) {
            BookList()
        } else {
            Row {
                BookList(Modifier.weight(1f))
                BookDetail(Modifier.weight(1f))
            }
        }
    }
}

600.dp는 플랫폼이 큰 화면으로 보는 경계와 같은 값입니다. 창이 그보다 좁으면 목록만 두고, 넓으면 목록과 상세를 나란히 둡니다. Material 3 Adaptive의 NavigationSuiteScaffold는 같은 경계를 하단 막대와 측면 레일로 나눠 줍니다. Navigation 3의 ListDetailSceneStrategy도 목록-상세 장면으로 같은 일을 합니다.

활동이 다시 만들어지는 조건도 바뀌었습니다. 키보드, 키보드 숨김, 내비게이션, 터치스크린, 색 모드처럼 화면 전체를 다시 그리지 않아도 되는 구성 변경은 기본적으로 활동을 재시작하지 않습니다. 대신 실행 중인 활동의 onConfigurationChanged()로 전달됩니다. 이 변경에서 활동을 일부러 다시 만들어야 하면 매니페스트에 android:recreateOnConfigChanges를 명시합니다.

안드로이드 17은 런처 아이콘을 길게 눌러 어떤 앱이든 떠 있는 버블로 만들 수 있습니다. 큰 화면의 작업 막대에는 그 버블을 모으는 Bubble Bar가 있고, 데스크톱에서는 그림 속 그림 창이 읽기 전용이 아니라 조작 가능한 창으로 남습니다. 최소 크기에서도 600.dp 분기가 좁은 쪽 레이아웃을 보여 주면 이 창들에서 내용이 잘리지 않습니다.

직접 해 보기

에뮬레이터 창의 너비를 600dp 아래와 위로 바꿔 목록만 보이는 상태와 두 열이 보이는 상태가 바뀌는지 확인하세요. 매니페스트의 screenOrientation을 portrait로 남겨 두어도 큰 화면에서는 가로로 늘어나는지 함께 봅니다.

해설

targetSdk 37에서 큰 화면의 방향 고정은 적용되지 않습니다. 레이아웃이 너비에 따라 갈라지면 창을 돌려도 같은 컴포저블이 좁은 배치와 넓은 배치를 오갑니다.