这种情况发生在多个班级类型的几个地方,但我现在坚持使用按钮示例。
所以我有一个按钮,我希望对话宣布为" Play"。内容描述设置为" Play"。但是,对讲也是在宣布课程,所以它的内容是"播放按钮"。
我通过重载onInitializeAccessibilityNodeInfo方法尝试了我在别处找到的解决方案
private void setupContentDescriptors() {
mPlayPauseButton.setAccessibilityDelegate(new View.AccessibilityDelegate() {
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info)
{
super.onInitializeAccessibilityNodeInfo(host, info);
//blanked to prevent talkback from announcing class/type
info.setClassName("");
info.setContentDescription("Play");
}
});
}
将班级名称设置为""工作得很好,但我很快发现这个解决方案只适用于API 23及更高版本。 根据文档,"从API 23开始,委托方法在宿主方法之后调用,所有属性都要被修改而不被宿主类覆盖。"
我尝试了其他几种方法无济于事。 想法?
答案 0 :(得分:3)
在API 23之前,如果需要覆盖类名,则需要创建子类并实现onInitializeAccessibilityNodeInfo()
。您无法使用委托来覆盖它。
也就是说,TalkBack正试图通过说出角色描述为您的用户提供一致和高质量的体验。在绝大多数情况下,您不应尝试覆盖此行为。
答案 1 :(得分:0)
如果你有一个小而着名的用户圈子,也许这是alanv答案的另一种选择。
在Talkback 5.2.1(*)中你可以这样做:
在"设置 - >下辅助功能 - >对讲 - >设置 - >冗长
您可以在此处打开/关闭条目"说出元素类型" 。
有了这个,用户自己可以决定他是否想要听到元素类型。这是另一个论点,不是修改Talkback读取元素的方式。
(*)我没有找到任何关于何时引入说话元素的详细设置的文档。在我的Android设备上使用Talkback 5.2.1它可以正常工作,而使用Talkback 5.0.3的设备则没有这个设置。所以介于两者之间的任何地方都必须引入。
答案 2 :(得分:0)
您尝试过
ViewCompat.setAccessibilityDelegate(mPlayPauseButton, new
AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View host,
AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.setClassName(null);
info.setContentDescription("your label");
}
})
ViewCompat应该注意版本处理。