아티클

안드로이드 접근성을 고려한 XML 마크업 3부, 윈도 제목

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 클래스에 대해서는 다음에 자세히 다루도록 하겠습니다. 
지금까지 설명한 것을 간단하게 정리하면 다음과 같습니다.
  1. 각 윈도의 제목이 텍스트 뷰와 같은 커스텀 형태로 화면에 표시되더라도 각 액티비티의 레이블을 지정해 줌으로써 톡백이 각 윈도의 제목을 자동으로 읽어줄 수 있도록 하는 것이 좋습니다.
  2. 화면에서 제목(타이틀 바)를 숨기거나 변경해도 톡백은 액티비티 레이블을 자동 제목 읽기 수단으로 가져옵니다.
  3. 개별 액티비티가 아닌 fragment와 같은 형식으로 윈도가 변경되는 경우에는 accessibilityPaneTitle 속성을 활용합니다.
아래 소스코드 및 apk 파일을 다운로드하여 위에서 설명한 부분을 시연해 볼 수 있습니다.

 

댓글 0
댓글을 작성하려면 해주세요.