我在Android上有一个按钮,上面写有“下一步”文字。
什么时候,我将可控性光标集中在按钮上,它会读出“下一步按钮”。这是我不想要的。我希望无论何时,光标都要关注“下一步”按钮,它必须读出“下一步按钮。双击选择”。通过设置,我可以很容易地做到这一点
btn.contentDescription("Next button. Double tap to select")
,
但后来它读出来了
“下一步按钮。双击选择按钮” ,意味着它还会读出最后一个按钮,这看起来很奇怪,“按钮”文本被读取两次。
有什么方法可以阻止最后一个按钮宣布?
答案 0 :(得分:2)
你正在尝试做一些由AT负责的事情。由于其类类型,AT知道该对象是一个按钮。 AT知道它是可点击的,因为Clickable是一个有效的可访问性操作。
然后,TalkBack会分享这些信息,这里是细分: “下一步按钮,(暂停)双击选择”“下一步” - >内容说明/文字。这是你控制的部分。
“按钮” - >根据对象的有效操作和类型(类)在TalkBack中计算。
“点按两次以选择” - >此公告基于Clickable是有效的可访问性操作。
所以,当你将内容描述设置为“下一步......”时,你最终会发出“下一步.......按钮(暂停)双击选择”的声明,不,没有,没有改写这个的方法。
如果你绝对想要使你的应用程序不易访问,你可以创建一个自定义控件,编写自己的手势识别器(如不使用“onClick”事件,因为这会使你的元素可访问性可点击)识别轻击手势。然后编写自己的内容描述,包括姓名,角色和说明。
在我看来,这将是非常愚蠢的!只需让内容描述为“下一步”,让TalkBack告诉用户您的元素是一个按钮以及如何与它进行交互。虽然这可能不是“完美”的措辞,无论这个要求来自何种愿景。这将是TalkBack用户习惯于宣布此类控制的方式。一致性有时比“正常”更重要。
答案 1 :(得分:1)
我知道我来晚了,但是在这里为所有可能碰到这篇文章的人发布答案。
其他选项是正确的...我们不应在内容描述中放置小部件的类型或如何与小部件进行交互。但是,一切并没有丢失。
从API 21开始,有一种方法可以通过AccessibilityNodeInfo自定义交互文本。您可以通过两种不同的方式使用此类:
AccessibilityNodeInfo具有getActionList()
方法。您可以通过向该列表添加新项来添加自定义TalkBack读出的文本:
info.getActionList().add(new AccessibilityNodeInfo.AccessibilityAction(AccessibilityAction.ACTION_CLICK, "select");
上面的代码应将“双击以激活” 更改为“双击以选择” 。我说应该,因为我只是从内存中编写该代码...我还没有验证它是否100%正确,但是应该遵循这些原则。
有两种方法可以利用该类,而您选择的方法将取决于您的情况。
方法1:将视图子类化:
如果创建正在使用的视图的子类(对于OP,它将是Button的子类),则可以覆盖onInitializeAccessibilityNodeInfo()
方法并将代码放在此处。
文档:https://developer.android.com/reference/android/view/View.html#onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo)
方法2:创建视图辅助功能委托
这可能会更加棘手和复杂,但是它确实提供了很大的灵活性,因为您不必将正在使用的视图子类化。
每个视图都有一种方法,可让您设置可访问性委托,该代理的行为就像中间人,并且您可以在信息进入“话语提示”之前对事物进行调整以实现可访问性。
因此,基本上,您将创建View.AccessibilityDelegate的子类,并使用我上面发布的代码覆盖它的onInitializeAccessibilityNodeInfo()
方法。
最后但并非最不重要...
我确实遇到了一种阻止“双击以激活” 文本的方法,这些文本不会被“话语提示”说出来。 仅在确实需要删除它时才应使用。
我重复...这通常不是您想要做的事。
我最近确实遇到了一个有意义的案例。我使用的是TabLayout,但我注意到,当焦点位于所选选项卡上时,“话语提示”将始终读出“双击选择”(是的,我已经使用上述方法更改了文本)。好吧...我们不想告诉用户选择一个已经选择的标签,特别是当操作导致无操作时。因此,我使用了这个小技巧来摆脱它,但仅限于当前选择的选项卡。我只留下了未选中的标签,这样“话语提示”仍会为他们提供互动文本。
在您的onInitializeAccessibilityNodeInfo()
方法中,您可以放置以下代码以删除该文本:
info.addAction(AccessibilityNodeInfo.ACTION_FOCUS);
同样,我是从内存中编写此代码的,所以我不知道那是否是100%,但是它为您提供了执行操作的要点。
答案 2 :(得分:-2)
您要做的是使用android:hint
提供有关输入信息的信息(而不是将其添加到标签中)。
您的标签将是“下一个”(使用带屏幕标签的labelFor
或隐藏标签使用android:contentDescription
)
然后你的提示将是“双击选择”(使用android:hint
)