본문 바로가기

안드로이드

안드로이드 접근성 accessibility 에 관하여

반응형

요즘 앱개발을 하면서 접근성 이슈가 많이와서 한번 정리해둘까 싶어서 작성하는 포스팅입니다.

 

간단하게는 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

 

모두를 위한 배달의민족 - 우아한형제들 기술 블로그

 

woowabros.github.io

aroundck.tistory.com/742

 

[Android/안드로이드] App을 accessible 하게 만들기 ( 장애인을 위한 앱 만들기 )

http://developer.android.com/guide/topics/ui/accessibility/apps.html - Android 는 장애인들을 위해 TTS ( Text-To-Speech ), Haptic Feedback, Trackball, D-pad navigation 등을 제공한다. 이것을 Accessibl..

aroundck.tistory.com

 

반응형

'안드로이드' 카테고리의 다른 글

안드로이드 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