如何阻止辅助功能宣布Android按钮为“按钮”?

ryevplcw  于 2023-03-21  发布在  Android
关注(0)|答案(5)|浏览(162)

我在Android中有一个按钮,上面写着文本**“下一个”。当我将访问光标聚焦在按钮上时,它会读出“下一个按钮”。这是我不想要的东西。我希望每当光标聚焦在“下一个”按钮上时,它必须读出“下一个按钮。双击选择”。这我可以很容易地做到,通过设置btn.contentDescription("Next button. Double tap to select"),但随后它读出了*“下一个按钮。双击选择按钮”***,意味着它额外读出了最后一个按钮,这似乎非常奇怪,“按钮”文本被读了两次。
有没有什么办法,我可以停止最后一个按钮被宣布?

ttisahbt

ttisahbt1#

你正在尝试执行AT的职责。AT知道对象是一个按钮,因为它的类类型。AT知道它是可点击的,因为可点击是一个有效的辅助功能动作。
TalkBack将分享这些信息,下面是详细信息:“下一步”按钮,(暂停)双击以选择”
“下一步”-〉内容描述/文本。这是您控制的部分。
“按钮”-〉根据有效操作和对象类型(类)在TalkBack中计算。
“双击以选择”-〉此声明基于可点击是一个有效的辅助功能操作。
所以,当你将内容描述设置为“下一步......”时,你最终会得到一个“下一步.......按钮(暂停)双击选择”的公告,不,没有办法覆盖这个。
如果你真的想降低应用的可访问性,你可以创建一个自定义控件,编写自己的手势识别器(比如不使用“onClick”事件,因为这会让元素的可访问性变为可点击)来识别点击手势,然后编写自己的内容描述,包括名称、角色和说明。
在我看来,这将是非常愚蠢的!只要让内容描述是“下一个”,让TalkBack告诉用户,你的元素是一个按钮,以及如何与它交互。虽然可能不是“完美”的措辞,你/无论这个需求来自谁的愿景。这将是TalkBack用户习惯于有这种类型的控制宣布的方式。一致性有时比事情“只是这样”更重要。

6za6bjd0

6za6bjd02#

我知道我已经迟到了,但在这里张贴一个答案,任何人都可能碰巧遇到这个职位。
其他人是对的......我们不应该把小部件的类型或者如何与小部件交互放在内容描述中。然而,一切并没有失去。
从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(安卓系统.视图.辅助功能.辅助功能节点信息)

方法2:创建视图辅助功能委托

这可能有点棘手和复杂,但它确实提供了大量的灵活性,因为您不必对正在使用的视图进行子类化。
每个视图都有一个方法,允许您设置一个可访问性委托,它的作用就像一个中间人,您可以在信息到达TalkBack之前出于可访问性的目的进行调整。
文件:设置可访问性委托(安卓系统.视图.视图.可访问性委托)
因此,基本上您创建了View.AccessibilityDelegate的子类,并用我上面发布的代码覆盖它的onInitializeAccessibilityNodeInfo()方法。
文件:https://开发者.android.com/参考/android/视图/视图.可访问性委托.html#onInitializeAccessibilityNodeInfo(安卓.视图.视图,%20安卓.视图.可访问性.可访问性节点信息)

最后但并非最不重要

我确实发现了一种方法,可以阻止“Talkback”说出 “双击以激活” 文本。只有在确实有必要将其删除时才应使用此方法。
我再说一遍......这通常不是你想做的事情。
我最近确实遇到过一个案例,我使用的是TabLayout,我注意到当焦点在所选标签上时,Talkback总是会读出“双击选择(是的,我已经使用了上面描述的方法来更改文本)。嗯......我们不想告诉用户选择一个已经选中的选项卡,特别是当操作导致无操作时。因此,我使用了这个小技巧来摆脱它,但只针对当前选中的标签。我让未选中的标签保持原样,这样Talkback仍然会给予它们交互文本。
onInitializeAccessibilityNodeInfo()方法中,可以放入以下代码来删除该文本:

info.addAction(AccessibilityNodeInfo.ACTION_FOCUS);

同样,我是根据记忆编写这段代码的,所以我不知道这是否是100%的,但它给了你要做什么的要点。

x8diyxa7

x8diyxa73#

试着在TalkBack -〉verbosity -〉speak element type -〉uncheck中取消设置。现在Talkback将不会在内容描述的末尾宣布视图的类类型。

rks48beu

rks48beu4#

这个问题可以通过在AccessibilityNodeInfo中伪造className来解决,如下所示:

fun View.setupAccessibility() {
    val delegate: AccessibilityDelegate = object : AccessibilityDelegate() {
        override fun onInitializeAccessibilityNodeInfo(
            host: View,
            info: AccessibilityNodeInfo,
        ) {
            super.onInitializeAccessibilityNodeInfo(host, info)
            info.className = "TextView" //this disables Button saying "button" at the end
        }
    }
    accessibilityDelegate = delegate
}
cidc1ykv

cidc1ykv5#

您要做的是使用android:hint来提供有关输入信息的信息(而不是将其添加到标签中)。
您的标签将是“Next”(使用labelFor作为屏幕标签,或使用android:contentDescription作为隐藏标签)
然后您的提示将是“双击以选择”(使用android:hint

相关问题