분리형 키보드를 지원하면 대형 화면 기기에서 사용자 생산성을 극대화할 수 있습니다. Android는 키보드가 기기에 연결되거나 기기에서 분리될 때마다 구성 변경을 트리거하므로 UI 상태가 손실될 수 있습니다. 앱은 상태를 저장하고 복원하여 시스템이 활동 재생성을 처리하도록 하거나 키보드 구성 변경을 위한 활동 재생성을 제한할 수 있습니다.
모든 경우에 키보드와 관련된 모든 데이터는 Configuration
객체에 저장됩니다. 구성
객체의 keyboard 및 keyboardHidden 필드에는 키보드 유형 및 사용 가능 여부에 관한 정보가 포함됩니다.
권장사항
대형 화면에 최적화된 앱은 소프트웨어 및 하드웨어 키보드에서 스타일러스, 마우스, 트랙패드, 기타 주변기기에 이르기까지 모든 유형의 입력 기기를 지원합니다.
외부 키보드 지원에는 구성 변경이 포함되며, 구성 변경은 다음 두 가지 방법 중 하나로 관리할 수 있습니다.
- 시스템이 실행 중인 활동을 다시 생성하도록 하고 앱의 상태 관리를 처리합니다.
- 구성 변경을 직접 관리합니다 (활동이 다시 생성되지 않음).
- 모든 키보드 관련 구성 값 선언
- 구성 변경 핸들러 만들기
텍스트 입력 및 기타 입력을 위해 UI를 세밀하게 제어해야 하는 경우가 많은 생산성 앱은 구성 변경을 처리하는 DIY 접근 방식을 활용할 수 있습니다.
특수한 경우, 예를 들어 도구 또는 편집 창을 위한 공간을 더 확보하기 위해 하드웨어 키보드가 연결되거나 분리될 때 앱 레이아웃을 변경할 수 있습니다.
Jetpack Compose에서는 다음 두 가지 방법으로 키보드 구성 변경에 반응할 수 있습니다.
- 반응형 UI:
LocalConfiguration.current를 사용하여 컴포저블에서 현재 구성 상태를 직접 읽습니다. 키보드가 연결되거나 분리되면 UI가 자동으로 리컴포지션되어 새 상태에 맞게 조정됩니다. - 부작용 콜백: 수명 주기 인식
DisposableEffect를 사용하여 호스트 활동에 구성 변경 리스너를 등록합니다. 이렇게 하면 활동을 다시 생성하거나 더미 뷰 요소를 인스턴스화하지 않고도 UI가 아닌 이벤트 (예: 로깅 또는 분석)를 트리거할 수 있습니다.
재료
android:configChanges: 앱 매니페스트의<activity>요소의 속성입니다. 앱이 관리하는 구성 변경에 관해 시스템에 알립니다.LocalConfiguration: 현재 기기Configuration을 노출하는 컴포저블 로컬 제공업체입니다.DisposableEffect: 컴포저블이 컴포지션에 들어갈 때 코드 블록을 실행하고 컴포저블이 컴포지션을 떠날 때 정리하는 Compose 부작용 API입니다.
단계
configChanges 속성을 선언하고 키보드 관련 값을 추가하여 활동 재생성을 방지합니다. 그런 다음 LocalConfiguration.current를 사용하여 컴포저블 레이아웃을 동적으로 조정하거나 DisposableEffect를 사용하여 구성 리스너를 등록합니다.
1. configChanges 속성 선언
이미 관리되는 구성
변경 목록에
keyboard|keyboardHidden 값을 추가하여 앱 매니페스트의 <activity> 요소를 업데이트합니다.
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. 키보드 구성 변경에 응답
Jetpack Compose에서 구성 변경을 처리하려면 UI를 업데이트하는지 아니면 부작용 콜백을 실행하는지에 따라 다음 옵션 중 하나를 사용하세요.
옵션 A: 반응형 UI (권장)
LocalConfiguration.current에서 키보드 유형을 직접 읽습니다. 하드웨어 키보드가 연결되거나 분리되면 이 값이 변경되고 Compose가 UI를 자동으로 리컴포지션합니다.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
옵션 B: 부작용 리스너
구성이 변경될 때 부작용 (예: 로깅, 로컬 데이터베이스 업데이트 또는 분석 트리거)을 실행해야 하는 경우
DisposableEffect를 사용하여 호스트ComponentActivity에 구성 변경 리스너를 등록합니다.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
결과
이제 앱이 실행 중인 활동을 다시 생성하지 않고도 외부 키보드가 연결되거나 분리되는 데 응답합니다.
추가 리소스
키보드 연결 또는 분리와 같은 구성 변경 중에 앱의 UI 상태를 저장하는 방법을 알아보려면 UI 상태 저장을 참고하세요.