我正在尝试制作一个可访问的Android应用程序,我们正在实现一种特定类型的拖放式UI小部件(带有一个'抓取器')句柄。
将此类窗口小部件中的事件公开给像TalkBack这样的AccessibilityService的最佳方法是什么?我一直在关注the documentation on Accessibility和the documentation on drag-and-drop functionality,我能想到的最好的方法是分配一个AccessibilityDelegate
来添加正确的实现,或者自定义触发Accessiblity动作。
答案 0 :(得分:1)
我的应用程序FPlay遇到了同样的问题:我有一个自定义的“滑块”控件,我希望当用户滑动手柄时,TalkBack会说出不同的值。
我的解决方案是在值改变时伪造事件AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
。因此,此解决方案仅适用于API 16+(因为它对我来说足够了,我从未尝试将其移植到较低的API)。
代码:
public final class BgSeekBar extends View {
...
@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)
event.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
return super.dispatchPopulateAccessibilityEvent(event);
}
//When this method is called from within onTouchEvent(), fromUser is true
private void setValue(int value, boolean fromUser, boolean usingKeys) {
if (value < 0)
value = 0;
else if (value > max)
value = max;
if (this.value != value) {
this.value = value;
if (listener != null)
listener.onValueChanged(this, value, fromUser, usingKeys);
updateBar();
if (fromUser)
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
}
}
...
}
*值得注意的是:这种解决方法是可行的,因为AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED
未在此类别的任何其他位置使用。