繁体   English   中英

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

[英]disabling view announcement when focused (Talkback Enabled)

我正在为我的 textview 使用自定义动态 contentDescription,因此它已在我的 java 类中实现,而不是在我的 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 的状态是“禁用”。 有没有办法不宣布那个状态?

我不想将可访问性设置为不重要,因为当对讲用户专注于 textview 时,我仍然希望我的动态 contentDescription 被背诵。

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

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

定义:

按钮 = android.widget.Button

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

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

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

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

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

为了实现您想要的行为,您希望 TextView 的AccessibilityNodeInfo表示与 TextView 的实际表示不同。 为了做到这一点,您可以使用AccessibilityDelegate ,我实际上不确定您要使用哪个回调。 在其中之一中,节点可能被“密封”,而在其中之一中,它可能尚未被密封。 您显然想要节点尚未密封的节点! 不管怎样,一般的方法是:

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)可以解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM