4

我有一个SwitchCompat带有文本的 as 切换(HQ/LQ 用于不同质量的流)。对于视力好的用户,我认为这意味着什么是显而易见的。但是我很难找到一个好的解决方案来使其易于访问。

我已经为SwitchCompat一般设置了 ContentDescription

<android.support.v7.widget.SwitchCompat
            android:id="@+id/qualitySwitch"
            style="@style/SwitchStyleCompat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textOff="LQ"
            android:textOn="HQ"
            android:contentDescription="stream quality"

并希望在每次SwitchCompat切换时设置一个 contentDescription 。

if (isChecked) {
 streamPlayerService.desireHighQuality();
 mQualitySwitch.setContentDescription("quality high");

} else {
 streamPlayerService.desireLowQuality();
 mQualitySwitch.setContentDescription("quality low");
}

但即使使用 contentDescription,textOn/textOff 标志也将通过Talkback导致类似“Quality high HQ switch”之类的内容被读取。有什么方法可以禁用 textOn/textOff 属性的读取,以便只向用户读取 contentDescription?

4

1 回答 1

3

您可以获得您正在寻找的确切行为。但唯一的方法是自定义控件,或者一些涉及开关背后不可见视图的黑客行为。如果 TalkBack 遇到一个开关,它会按照你说的方式读出。共享状态和价值信息。在您开始编写自定义控件之前,让我向您介绍我认为更易于访问的解决方案。并且还鼓励您查看我的开源应用程序,该应用程序涉及许多可访问性概念,实际上包含我在这里与您分享的方法的示例。

https://github.com/dequelabs/Deque-University-for-Android

请记住,对于可访问性,任何文本或状态都必须以等效的方式共享。您无法将用户听到的内容与他们看到的内容区分开来。我们不仅关心盲人,还关心那些可能只有视力障碍的人。如果公告与他们的预期完全不同,那可能会非常混乱。此外,如果公告令人困惑,也许您应该重新考虑它是否同样让有视力的用户感到困惑......

因此,如果您有一个开/关开关,那么在公告期间的某个时间点它会打开或关闭是合适的。这是用户将习惯的,对于使用您的控件的可能有阅读障碍的用户来说,如果您要覆盖此行为会非常混乱。如果您的控件的文本让有视力的用户感到困惑,并且您重申了这个确切的文本,那么对于视力不佳的用户来说同样会感到困惑。这实际上比为 TalkBack 用户创建单独的用户体验更“可访问”。因为这只是意味着您有用户体验问题,需要更改标签的措辞。

完成此操作的最佳方法是使用 LabelFor 属性。

<TextView
    android:labelFor="@+id/your_id"
    android:text="My Text" />

<ToggleButton android:id="@+id/your_id"/>

这将导致它像这样读取:

HQ,开关,代表高质量

如果您专注于开关,这正是您需要的信息。开关上的文字是“HQ”,它是一个开关,它与视觉标签“质量高”相关联。状态、角色、姓名……连续出现。这是一件美好的事情!

如果您认为这仍然令人困惑,您还可以向 TextView 添加内容描述,以便 TalkBack 用户获得一些额外的上下文,尽管它应该非常类似于实际文本。(例如:包含实际文本,带有附加信息,或者可能进行一些首字母缩写词扩展)。

<TextView
    android:labelFor="@+id/my_id"
    android:text="Quality High"
    android:contentDescription="... Quality High ..." />

<ToggleButton android:id="@+id/my_id"/>

这将导致内容描述被读出,因此它会像这样读出:

总部,切换到 ... 质量高 ...

或者像这样:

<TextView
    android:labelFor="@+id/my_id"
    android:text="A misleading acronym CA"
    android:contentDescription="A misleading acronym Certificate Authority" />

<ToggleButton android:id="@+id/my_id"/>
于 2016-02-27T17:17:09.077 回答