8

我有一个像下面这样的 EditText

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

我想让 TalkBack 说“用户名字段”,但它说“用户名”。它忽略内容描述。

不要告诉我删除提示或内容描述。我需要同时使用两者。

任何建议将不胜感激。

4

6 回答 6

9

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

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

做这样的事情:

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

<EditText android:id="@+id/editTextField"/>
于 2015-06-11T14:08:10.153 回答
2

根据官方文档,你不应该设置android:contentDescription等于任何东西。相反,只使用android:hint.

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

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

于 2018-12-19T22:40:35.133 回答
0

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

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

    <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}
于 2020-02-18T13:53:05.737 回答
-1

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

对于提示 - > android:hint

对于 TalkBack -> android:contentdescription

于 2016-07-26T08:01:16.013 回答
-2

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

public CharSequence getTextForAccessibility() {
    CharSequence text = getText();
    if (TextUtils.isEmpty(text)) {
        text = getContentDescription();
    }
    return text;
}
于 2016-05-06T14:19:16.277 回答
-8

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

<string name="description">your desc goes here</string>
于 2015-04-27T07:57:31.830 回答