안드로이드 접근성을 고려한 XML 마크업 3부, 윈도 제목
Nts Nuli
2019-03-04 10:39:22
안녕하세요, 엔비전스입니다.
‘안드로이드 접근성을 고려한 XML 마크업 2부, android:hint’에서는 편집 영역의 접근성 이슈에 대해 살펴보았습니다. 이번 아티클에서는 각 창(window)의 제목 지정과 접근성 이슈에 대해 살펴보도록 하겠습니다.
Activity, setTitle과 TalkBack
레이아웃을 어떻게 구성하느냐에 따라 다르겠지만 웹페이지도 각 페이지마다 페이지 타이틀이 있듯이 안드로이드 네이티브 앱에서도 각 윈도마다 고유한 제목이 있습니다. 이러한 제목은 화면에 표시될 수도 있고 상황에 따라 hide() 메서드 등을 사용하여 화면에서 제목을 숨길 수도 있으며 타이틀 영역을 커스텀으로 제공할 수도 있습니다. 일반적으로는 각 화면을 activity라고 하며 각각의 액티비티에 android:label 을 삽입하면 화면 제목 표시줄에 해당 레이블이 제목으로 표시됩니다. 물론 setTitle 등의 메서드를 통해 액티비티 레이블과 화면에 표시되는 제목을 다르게 할 수도 있습니다.
기본적으로 톡백에서는 새로운 윈도에 진입하였을 때 화면에 표시되는 제목 혹은 톡백에서 포커스 되는 요소와 별개로 그 윈도의 제목을 자동으로 읽어주게 되는데 이것은 그 윈도의 액티비티 레이블 혹은 setTitle 메서드로 지정된 것을 제목으로 인식하여 자동으로 읽는 것입니다. 즉 액티비티 레이블을 자동으로 음성 출력함으로써 사용자에게 현재 윈도의 제목을 알려주게 됩니다. 따라서 스크린리더 사용자 입장에서는 윈도의 제목을 화면에서 숨기거나 커스텀으로 타이틀 바를 수정하여 제목을 제공하더라도 각 윈도의 activity label을 명확하게 제공해줄 필요가 있습니다. 만약 각 액티비티의 레이블을 지정하지 않으면 기본적으로 앱 이름에 지정된 액티비티 레이블을 타이틀로 읽습니다. 따라서 한 앱에서 다른 윈도로 진입했는데 같은 레이블을 타이틀로 읽는다면 사용성을 떨어뜨리는 요인이 될 수 있습니다. 각 액티비티의 레이블을 바꾸는 방법은 간단합니다. 각각의 액티비티에 해당하는 android:label 을 지정해 주면 됩니다. 물론 android:label을 지정했더라도 해당 액티비티에서 setTitle을 변경했다면 커스텀 앱 바에 setTitle을 지정하지 않은 이상 setTitle 메서드 제목 정보를 가지고 옵니다.
Fragment를 사용하는 경우
한 앱의 여러 윈도가 각각의 액티비티로 나누어져 있다면 액티비티 내의 android:label을 지정해 주는 것만으로 문제가 없지만 하나의 윈도가 여러 fragment(조각)으로 나누어져 있어서 윈도가 변경될 때 fragment가 변경되는 경우에는 기본적으로는 톡백에서 고유한 액티비티 레이블을 지정해줄 수 있는 방법이 없었습니다. ㄸ라서 화면은 변경되었음에도 톡백에서는 아무런 사운드나 정보도 출력해 주지 않아 사용자가 화면을 터치해 보기 전까지는 윈도가 바뀌었음을 알 수 없었습니다. 그래서 얼마 전까지는 fragment 등으로 윈도가 전환되는 경우에는 접근성을 고려해 주지 못하거나 announceForAccessibility 메서드를 사용하여 윈도 제목을 자동으로 읽어주도록 구현했습니다. (announceForAccessibility 에 대해서는 다음에 자세히 다루겠습니다.)
그러나 안드로이드 9.0부터 지원되는 API인 accessibilityPaneTitle 속성을 이용하면 이 문제는 쉽게 해결됩니다. 각 fragment에 accessibilityPaneTitle=”테스트”와 같이 마크업하면 마치 새로운 액티비티가 열린 것처럼 톡백에서는 제목을 출력해 줍니다. 따라서 fragment로 윈도가 전환되는 경우에는 accessibilityPaneTitle 사용을 권장합니다. 단 위에서도 기술한 바와 같이 본 기능은 안드로이드 9.0부터 지원되는 API이므로 하위 버전 사용 시 호환이 되지 않습니다.
Window change event
한 액티비티 안에서 화면의 레이아웃이 바뀌었을 때, 때에 따라서는 스크린리더 사용자에게 윈도가 변경되었음을 알려야 할 때가 있습니다. 이때는 sendAccessibilityEvent 메서드와 accessibilityPaneTitle을 적절히 활용하면 됩니다. AccessibilityEvent 클래스에 대해서는 다음에 자세히 다루도록 하겠습니다.
지금까지 설명한 것을 간단하게 정리하면 다음과 같습니다.
- 각 윈도의 제목이 텍스트 뷰와 같은 커스텀 형태로 화면에 표시되더라도 각 액티비티의 레이블을 지정해 줌으로써 톡백이 각 윈도의 제목을 자동으로 읽어줄 수 있도록 하는 것이 좋습니다.
- 화면에서 제목(타이틀 바)를 숨기거나 변경해도 톡백은 액티비티 레이블을 자동 제목 읽기 수단으로 가져옵니다.
- 개별 액티비티가 아닌 fragment와 같은 형식으로 윈도가 변경되는 경우에는 accessibilityPaneTitle 속성을 활용합니다.
아래 소스코드 및 apk 파일을 다운로드하여 위에서 설명한 부분을 시연해 볼 수 있습니다.
조회수4362