聚焦时禁用查看公告(启用对讲)

disabling view announcement when focused (Talkback Enabled)

我正在为我的文本视图使用自定义动态 contentDescription,因此它已在我的 java class 而不是在我的 xml 文件中实现。

private void enableButton(TextView textView, boolean enabled) {
    if (textView == null) {
        return;
    }
        if (!enabled) {
            textView.setContentDescription(textView.getResources().getString(R.string.install_disabled));
        } else {
            textView.setContentDescription(textView.getResources().getString(R.string.install));
        }
    textView.setEnabled(enabled);
}

在我启用我的 textview 可点击后,当启用对讲时,关注我的 textview 会宣布我的 textview 状态为“已禁用”。有没有办法不宣布那个状态?

我不想将无障碍设置为不重要,因为我仍然希望当对讲用户关注文本视图时,我的动态contentDescription 被背诵。

建议: 我相信罪魁祸首是 "setEnabled" 方法,它以某种方式触发并宣布 textview 的状态,但我仍然无法阻止它背诵最后一个。

我的第一个回答是:不要管它! "disabled" 公告告诉 TalkBack 用户那里有一个用户界面控件,在某些情况下可以与之交互,但当前未激活。根据您的描述,这正是您所拥有的。从可访问性的角度来看,删除公告实际上会使事情变得更糟,WCAG 1.3.1 中涵盖了为什么会出现这种情况的解释。

定义:

按钮 = android.widget.Button

按钮 = 一个用户界面组件,当您单击它时会执行某些操作。

文本 = 传达信息但未激活的用户界面组件

长话短说,控件始终处于可以激活的状态,"not disabled" 本身就是重要信息,应该与用户共享。特别是因为您正在使用 "TextView" 来实现它。这并不是一种非常罕见的做法,但 TalkBack 计算角色(按钮、link、图像、文本等)的方法之一是查看 object 的 Class/Type。因此,当它看到 TextView 时,它将假设为 Text,除非您另行通知它。现在,由于您已将点击侦听器添加到您的 TextView(或手势识别器,或其他),TalkBack 可能能够弄清楚您正在处理的内容实际上是 "button",但它可能不是。无论如何,这个 "button"(小写 B!)不活跃的事实是与用户分享的重要状态,并向他们传达他们可以以某种方式启用它并稍后返回并与之交互的事实。这是非常重要的信息!想象一下,如果网页上的每个 button/link 看起来都像平面文本?你怎么知道要与什么互动?

现在,我将向您展示这个拼图的不同部分,作为信息,但我真的鼓励您不要管公告。这是来自经常在 Accessibility 会议上就 Native Android 开发发表演讲的人,请留下此公告。不这样做表明他们误解了有视力障碍的用户希望如何感知您的应用程序中的控件,以及对他们来说很重要的信息。

TextView 上的setEnabled() 函数直接对应于AccessibilityNodeInfoisEnabled() 属性。

为了实现您想要的行为,您希望 TextView 的 AccessibilityNodeInfo 表示不同于 TextView 的实际表示。为此,您可以使用 AccessibilityDelegate,实际上我不确定您要使用哪个回调。在其中一个节点中,节点可能是 "sealed",在其中一个节点中,它可能尚未密封。您显然想要节点尚未密封的节点!不管一般做法是:

textView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {

        // Let the default implementation populate the info.
        super.onInitializeAccessibilityNodeInfo(host, info);

        // Override this particular property
        info.setEnabled(whateverYouThinkItShouldBe);
    }
});

setClickable(false)代替setEnabled(false)就可以解决这个问题