Jetpack Compose: 접근성 포커스와 키보드 포커스의 차이점 및 제어 방법

🤖 AI 추천

이 콘텐츠는 Jetpack Compose를 사용하여 안드로이드 앱을 개발하는 주니어 및 미들 레벨 개발자에게 특히 유용합니다. 접근성 기능을 고려한 UI 개발에 관심이 있거나, `focusRequester`와 같은 포커스 관리 API에 대한 이해를 높이고자 하는 개발자에게 추천합니다.

🔖 주요 키워드

Jetpack Compose: 접근성 포커스와 키보드 포커스의 차이점 및 제어 방법

핵심 기술

본 글은 Jetpack Compose에서 안드로이드 접근성(스크린 리더, TalkBack 등) 포커스와 키보드 포커스가 다르게 동작하는 이유를 설명하고, 각 상황에 맞는 포커스 제어 방법을 제시합니다.

기술적 세부사항

  • 접근성 포커스 vs. 키보드 포커스:
    • 접근성 포커스: 스크린 리더 사용 시 UI 요소에 설정되는 포커스. 시스템이 관리하며 개발자가 직접 수정할 필요 없음.
    • 키보드 포커스: 키보드 또는 유사 장치로 네비게이션할 때 인터랙티브 요소에 설정되는 포커스. 기본적으로 시각적인 표시가 적음.
  • 포커스 가능한 요소: 터치 입력으로 상호작용 가능한 모든 컴포넌트(버튼, 체크박스, 스와이프 가능한 요소, 그래프 등)는 포커스 가능해야 함.
  • 포커스 가능하게 만드는 방법:
    • clickable, toggleable, selectable modifier 사용: 클릭, 토글, 선택 가능한 컴포넌트에 적합.
    • focusable modifier 사용: 클릭/토글/선택은 아니지만 키보드 단축키 등 사용자 상호작용이 필요한 컴포넌트에 사용.
  • 프로그래밍 방식 포커스 이동:
    • 키보드 포커스: FocusRequester를 사용하여 원하는 요소로 포커스 이동 가능. Modifier 순서(focusRequester가 포커스 가능 modifier보다 먼저 와야 함)가 중요.
    • 접근성 포커스: focusRequester는 작동하지 않음. semantics modifier의 focused 속성 변경 또는 LaunchedEffect를 활용한 상태 관리를 통해 우회 구현.
  • 포커스 순서 변경:
    • 접근성 포커스: 부모 컴포넌트에 semantics { isTraversalGroup = true }를 설정하고, 자식 요소들에 traversalIndex를 지정하여 순서 제어.

📚 관련 자료