안드로이드에서 사용 가능한 접근성 유틸 클래스 소개
안녕하세요, 엔비전스입니다.
널리 포럼을 통해서 자바 및 코틀린으로 안드로이드 네이티브 앱 개발 시 사용 가능한 접근성을 쉽게 적용할 수 있는 유틸 클래스를 계속적으로 업데이트하고 있습니다. 본 문서에서는 해당 클래스를 배포한 배경에 대해 다루도록 하겠습니다.
접근성 관점에서 각 요소가 가리키는 요소 유형이나 상태 정보는 화면 레이아웃을 볼 수 없는 스크린 리더 사용자가 각 요소들이 의미하는 바를 정확하게 파악하도록 돕는다는 측면에서 굉장히 중요합니다. ‘확인 버튼’이라고 읽어주는 것과 ‘선택 안됨, 확인 체크 상자’라고 읽어주는 것은 같은 레이블을 가진 요소라 하더라도 그 의미가 전자는 실행, 후자는 체크하는 것으로 완전히 달라지는 것이 하나의 예입니다.
위와 같은 관점에서 안드로이드 네이티브 앱을 개발하다 보면 다른 플랫폼에 비해 요소의 유형이나 상태 정보를 변경하는 방법이 까다롭다는 것을 느끼신 분들이 많으리라 생각합니다. 예를 들어 iOS에서는 UILabel 객체를 보이스오버가 버튼으로 읽도록 변경한다면 단 한 줄의 코드로 가능하지만 안드로이드에서는 접근성 노드 정보를 변경하기 위해 관련된 객체 선언, 접근성 정보 초기화, 요소 유형 변경에 이르기까지 꽤 많은 줄의 코드가 필요합니다.
그래서 안드로이드의 경우 접근성이 개선된 많은 앱에서 커스텀 뷰의 요소 유형이나 상태 정보를 대체 텍스트로 제공하는 경우가 많습니다. 여러 번 언급했듯이 대체 텍스트에는 레이블과 관련된 부분만 제공해야 하며 요소 유형이나 상태 정보는 보조기술, 특히 톡백에서 인식 가능한 유형 및 상태 정보를 사용해야 합니다. 이것은 톡백 사용자가 여러 컨트롤과 상호작용하는 데 있어 큰 도움을 주기 때문입니다.
따라서 요소 유형이나 상태 정보를 조금 더 쉽게 개발할 수 있도록 해야겠다는 필요성을 느끼게 되었습니다.
접근성 유틸 클래스의 특징
저희가 배포한 유틸 클래스는 iOS 와 마찬가지로 대부분의 요소 유형 및 상태 정보를 자바 및 코틀린에서 단 한 줄의 코드만으로 개발이 가능하도록 도울 뿐만 아니라 안드로이드에서 제공하는 몇몇 접근성과 관련된 메서드들을 조금 더 간단하게 적용할 수 있도록 돕습니다. 적용 가능한 메서드 및 이에 대한 특징은 다음과 같습니다.
- 요소 유형 설정: 버튼, 라디오 버튼, 체크 상자, 탭, 드롭다운, 토글 버튼.
- 상태정보 설정: 선택됨, 체크/체크 해제됨, 버튼 확장/축소됨, 라디오 버튼 확장/축소됨.
- 기타: 액티비티 실행 시 톡백 켜짐 감지, 접근성 초점을 특정 요소로 보내기, 활성화하려면 이중 탭하세요 힌트 없애기, 화면에 보이지 않는 알림 메시지 제공하기, 불필요하게 선택됨이라고 읽는 상태 정보 없애기.
- 요소 유형 및 상태 정보는 접근성 노드 정보를 변경하여 적용하였으므로 톡백과 완전히 호환됩니다. (컨트롤 단위로 이동하거나 상태 정보 변경 시 음성 피드백 제공 등).
- 탭 컨트롤의 경우 선택된 탭에 대해서는 이미 선택되었으므로 활성화하려면 이중 탭하라는 힌트 메시지를 삭제하여 실제 안드로이드에서 제공하는 탭 레이아웃과 최대한 비슷하게 구현하였습니다.
위에서 설명한 기능들에 대한 자세한 적용 방법은 널리 포럼을 통하여 자세히 설명하고 있으며 기능 또한 꾸준히 업데이트하고 있으니 적용 방법에 대해서는 널리 포럼을 참고해 주시기 바랍니다.
접근성 유틸 클래스 적용 시 주의사항
- 버튼이나 드롭다운과 같이 상태 정보가 없는 요소들은 메서드 내에 참조할 뷰만 인자 값으로 포함시키면 되지만 상태 정보를 가지고 있는 요소들은 true 혹은 false 값을 정확하게 지정해 주어야 합니다.
단 개발 시에 체크됨, 확장됨 상태 정보를 selected true 속성을 사용하여 적용해 놓은 경우가 많으므로 selected 값에 의해 상태 정보가 변경된다면 최초 한 번만 상태 정보를 제공하면 자동으로 클릭에 따라 변경됩니다. - 위에서 언급한 것처럼 요소 유형 및 상태 정보들은 모두 접근성 노드 정보를 변경하여 보조기술에서 호환 가능하도록 만들어졌습니다. 따라서 기존에 이미 요소 유형을 가지고 있는 요소들은 탭을 제외하고는 다른 요소로의 변경이 불가하며 이는 안드로이드 네이티브 접근성 자체의 특징입니다.
탭 요소는 요소 유형 정의를 roleDescription 을 사용하였는데 roleDescription 사용 시에는 이미 요소 유형 정보를 가지고 있더라도 roleDescription 에서 정의하는 값으로 요소 유형 변경이 가능하기 때문입니다. 따라서 버튼, 드롭다운과 같은 요소 유형 변경은 기존에 요소 유형을 가지고 있지 않은 뷰에서만 적용이 가능하겠습니다. - 확장/축소 상태 정보를 가지는 메서드(확장버튼, 확장라디오버튼)의 경우 반드시 클릭 속성을 통해 확장 혹은 축소할 수 있어야 합니다. 이는 확장/축소의 경우 AccessibilityAction 을 통해서도 확장, 축소 기능을 구현해 주어야 하므로 사용자가 톡백에서 지원하는 커스텀 액션을 통해서 확장, 축소 기능을 실행할 때 해당 요소를 클릭하도록 했기 때문입니다.
지금까지 안드로이드에서 적용 가능한 유틸 클래스의 특징 및 적용 시 주의사항에 대해 살펴보았습니다. 해당 클래스가 접근성 적용에 조금이나마 도움이 되었으면 합니다.