Android切换textOn / Off会阻止从Talkback中读取

时间:2016-02-26 15:06:55

标签: android talkback switchcompat android-accessibility

我有SwitchCompat切换文本(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给用户?

1 个答案:

答案 0 :(得分:1)

您可以获得您想要的确切行为。但唯一的方法是使用自定义控件,或者涉及交换机后面隐藏视图的一些hackery。如果TalkBack遇到一个开关,它会按照你说的方式读出来。共享状态和价值信息。在您将自定义控件组合在一起之前,让我向您介绍我认为更易于使用的解决方案。并且还鼓励您查看我的开源应用程序,它涉及许多可访问性概念,并且实际上包含了我在这里与您分享的方法的示例。

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

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

因此,如果你有一个开/关开关,那么在公告期间的某个时刻开启或关闭它是合适的。这是用户将习惯使用的内容,对于使用您的控件的使用者而言,如果您要覆盖此行为,则会非常困惑。如果您的控件文本对于有视力的用户而言是混乱的,并且您重申了这个确切的文本,那么对于没有视力的用户来说同样会造成混淆。实际上这更容易获得&#34;而不是为TalkBack用户创建单独的用户体验。因为它只是意味着您遇到了用户体验问题,并且需要更改标签的措辞。

实现此目的的最佳方法是使用LabelFor属性。

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

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

这将导致它读出:

  

HQ,switch,for Quality High

如果您专注于开关,这正是您需要的信息。开关上的文字是&#34; HQ&#34;它是一个开关,它与视觉标签相关联,质量很高&#34;。状态,角色,名称......连续排列。这是一件美丽的事情!

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

<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"/>