요즘 앱개발을 하면서 접근성 이슈가 많이와서 한번 정리해둘까 싶어서 작성하는 포스팅입니다.
간단하게는 view에 contentDescription 속성을 넣어서 포커싱 되었을때 어떻게 읽어줄 지를 정해 줄 수 있습니다.
또한, importantForAccessibility="no" 를 설정하여 필요없는 정보를 읽어주는 것을 예방할 수 있죠.
이런 포커스 관리하는 방법 중 일부로 View setAccessibilityTraversalAfter/Before 를 이용하는 방법이 있다고 합니다.
AccessibilityDelegate()
뷰에 대한 접근성을 커스터마이징하고 싶다면 AccessibilityDelegate()를 오버라이딩하여 설정할 수 있습니다.
몇 가지 메소드에 대해서 알아봅시다.
- sendAccessibilityEvent()
user가 view에 어떤 action을 가했을 때 불린다.
- sendAccessibilityEventUnchecked
System에서 accessibility feature가 enable 되었을때를 감지하여 불린다.
- dispatchPopulateAccessibilityEvent
custome view가 accessibility event를 생성했을 때 불린다.
- onPopulateAccessibilityEvent
AccessbilityEvent의 text output을 set한다.
- onInitializeAccessibilityEvent
view의 text를 제외한 추가 정보를 얻기 위해 호출된다.
- onInitializeAccessibilityNodeInfo()
view state에 관련된 정보를 accessibility service에 제공하는데 사용된다. 간단하지 않은 custom view 의 경우는 추가 정보를 입력해주는것이 좋다.
fun setAccessibilityClickActionHintScript(view: View, hintScript: String?) {
if (isTalkbackOn) {
view.setAccessibilityDelegate(object : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfo) {
super.onInitializeAccessibilityNodeInfo(host, info)
val infoCompat = AccessibilityNodeInfoCompat.wrap(info)
val clickAction = AccessibilityActionCompat(AccessibilityNodeInfoCompat.ACTION_CLICK, hintScript)
infoCompat.addAction(clickAction)
}
})
}
}
hintScript에 해당하는 내용을 수정하여 활성화하려면 두 번 탭하세요. 를 "블라블라하려면" 두번 탭하세요. 형태로 수정할 수 있습니다.
꽤 헤메던 접근성 중 하나가 SeekBar 컨트롤이었는데요. 관련 내용을 또 정리해보자면 기본적으로 SeekBar 토크백이 몇퍼센트입니다.
이런식으로 읽어지게 됩니다. 이를 커스터마이징하기 위한 방법인데요.
1. accessibilityLiveRegion="assertive" 이용하기
단순히 읽어줘야할 정보 TextView가 업데이트 되고 있다면 몇퍼센트입니다. 보다 그걸 읽어주는게 좋겠죠?
그럴때 이것을 이용하면 됩니다.
2. AccessibilityDelegate를 이용하기
이 방법은 읽어주는 것도 다르게 해야하지만 seekBar를 옮겼을 때 액션이 있다면 사용하면 좋습니다.
이 방법을 이용하기 위해서 첫 번째로 해야할 것은 onInitializeAccessibilityNodeInfo를 통해 contentDescription을 읽어주길 원하는 방식으로 설정해둡니다. 그 후 performAccessibilityAction을 오버라이드해서 액션을 추가해줍니다.
AccessibilityNodeInfo.ACTION_SCROLL_FORWARD -> {
// todo seekBar가 움직였을 때 해야할 액션
seekBar.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED)
}
이런식으로 구현하면 됩니다. 근데 그냥 저렇게 하게되면 몇번은 음성이 씹히는 경우가 있었습니다. 그래서 매 번 식바 업데이트에 대한 음성을 출력시키고 싶으시다면 delay를 줘서 출력이 보장되도록 수정해주시면 됩니다.
참고
woowabros.github.io/experience/2020/01/30/app-for-everyone.html
'안드로이드' 카테고리의 다른 글
안드로이드 include vs merge 태그 차이 (0) | 2021.04.14 |
---|---|
AlertDialog (0) | 2021.03.21 |
Android Room (0) | 2021.01.18 |
RecyclerView 의 Payload (0) | 2020.12.30 |
IPC 를 위한 Serializable, Parcelable, Parcel, 그리고 Bundle 까지 (0) | 2020.02.28 |