【问题标题】:Android TalkBack: Hint overwrites contentDescriptionAndroid TalkBack:提示覆盖 contentDescription
【发布时间】:2015-07-05 13:28:38
【问题描述】:

我有一个如下所示的 EditText

<EditText
    android:id="@+id/extUsername"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="Username field"
    android:hint="Username" />

我想让 TalkBack 显示“用户名字段”,但它显示的是“用户名”。它忽略 contentDescription。

不要告诉我删除提示或内容描述。我需要两个都用。

任何建议将不胜感激。

【问题讨论】:

  • 不要在编辑字段上设置内容描述。不要在内容描述中包含组件类型。如果需要,可访问性服务会处理此问题。只需设置 android:hint 或使用 android:labelFor 如果您有单独的标签。

标签: android accessibility hint talkback


【解决方案1】:

您需要将其添加到您的 string.xml 文件中:

<string name="description">your desc goes here</string>

【讨论】:

  • 这不是答案。字符串已经在 string.xml 文件中。我这样写是为了方便你阅读。
【解决方案2】:

您想要做的是改用 LabelFor。 LabelFor 允许将可视标签与 EditText 框相关联。如果您愿意,可以使视觉标签不可见,这样它就不会改变您的视觉布局。

提示的缺点是在输入文本后它们会消失,这使得它们的可访问性工具非常差。如果您依赖提示获取辅助功能信息,则您的应用无法访问。

做这样的事情:

<TextView
     android:text="@string/yourEditTextDescription"
     android:labelFor="@+id/editTextField" />

<EditText android:id="@+id/editTextField"/>

【讨论】:

  • 我在 xml 文件中遇到错误。 TextView 需要显示 android:layout_width 和 android_height 错误消息。我该如何处理。
  • 添加 android:layout_width 和 android:layout_height?我删除了脚手架来演示可访问性的重要部分。您的 xml 仍然需要包含 Android 通常期望的所有其他样式位。
  • 我尝试了我们通常在 xml 文件中使用的所有样式位。但我收到错误消息 castException: android.widget.TextView cannot be cast to android.widget.EditText
  • 听起来您试图将 TextView 转换为 EditText ...您应该将 Java 和 xml 添加到另一个问题中。您当前的问题与此无关。在 cmets 中扩展调试对话很糟糕。
  • 似乎如果您将TextView 的可见性设为invisiblegone,当您点击EditText 时,TalkBack 不会读取此标签。
【解决方案3】:

您应该使用重写的 TextView.getTextForAccessibility() 方法扩展 EditText 类,以通过以下方式获得预期的行为:

public CharSequence getTextForAccessibility() {
    CharSequence text = getText();
    if (TextUtils.isEmpty(text)) {
        text = getContentDescription();
    }
    return text;
}

【讨论】:

【解决方案4】:

注意:对于 EditText 字段,提供 android:hint 属性而不是内容描述,以帮助用户了解文本字段为空时预期的内容。填写该字段后,TalkBack 会从内容描述中读取输入的内容以帮助用户,而不是提示文本。

提示 -> android:hint

对于 TalkBack -> android:contentdescription

【讨论】:

  • 提示不应包含重要信息,如字段名称。用户名是非常重要的信息,应该不仅仅是临时的。 TalkBack 用户不必删除他们输入的文本,就可以知道他们输入文本的目的。一个不好的提示:用户名。一个很好的提示:John.Smith。
【解决方案5】:

根据官方文档,您不应该将android:contentDescription 设置为等于任何值。相反,只使用android:hint

<EditText
    android:id="@+id/extUsername"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:hint="Username" />

您的contentDescription 中的“字段”应该被删除,因为 TalkBack 会将其宣布为“用户名编辑框”

【讨论】:

    【解决方案6】:

    不幸的是,android:hint 总是会覆盖 android:contentDescription。您可以创建仅用于设置 android:labelFor 的 TextView,但根据我的经验,TalkBack 将同时读取提示和 labelFor。

    添加 TextView 的正确方法,仅用于为 TalkBack 标记 EditText :

        <TextView
             android:layout_width="0dp"
             android:layout_height="0dp"
             android:text="@string/yourDescription"
             android:labelFor="@+id/editText" />
    
        <EditText android:id="@+id/editText"/>
    

    因此,其中一种解决方案是您可以检查 TalkBack 是否已打开并以编程方式更改提示。您可以通过以下方式检查 TalkBack 是否开启:

      if(context.isScreenReaderOn){
        ...
    }
    

    然后你在 Kotlin 中创建了一个内联函数,例如:

    fun Context.isScreenReaderOn():Boolean{
        val am = getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
        if (am != null && am.isEnabled) {
            val serviceInfoList =
                am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN)
            if (!serviceInfoList.isEmpty())
                return true
        }
        return false}
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2017-03-30
      • 2012-02-23
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      相关资源
      最近更新 更多