-1

我正在为我的 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 时,我的动态 contentDescription 被背诵。

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

4

2 回答 2

0

使用setClickable(false)替换setEnabled(false)将解决这个问题。

于 2021-02-24T08:35:27.443 回答
0

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

定义:

按钮 = android.widget.Button

button = 当您单击它时执行某些操作的用户界面组件。

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

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

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

TextView 上的setEnabled()函数直接对应于 的isEnabled()属性AccessibilityNodeInfo

为了实现您想要的行为,您希望 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);
    }
});
于 2017-05-23T05:31:32.733 回答