Android TalkBack:提示覆盖contentDescription

时间:2015-04-27 07:43:02

标签: android accessibility hint talkback

我有一个如下所示的EditText

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

我希望TalkBack说&#34;用户名字段&#34;但它说&#34;用户名&#34;。它忽略了contentDescription。

请勿告诉我删除提示或contentDescription。我需要同时使用它们。

任何建议都将不胜感激。

6 个答案:

答案 0 :(得分:8)

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

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

做这样的事情:

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

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

答案 1 :(得分:0)

根据官方文档,您不应将var gulp = require('gulp'), durandal = require('gulp-durandal'), rimraf = require('rimraf'); gulp.task('clean', function (cb) { rimraf('app/main-built.js', cb); }); gulp.task('durandal', ['clean'], function () { durandal({ baseDir: 'app', main: 'main.js', output: 'main-built.js', almond: true, minify: true }) .pipe(gulp.dest('app')); }); gulp.task('default', ['durandal']); 设置为任何值。相反,仅使用android:contentDescription

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

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

答案 2 :(得分:0)

不幸的是,android:hint将始终覆盖android:contentDescription。您可以创建TextView,仅用于设置android:labelFor,但根据我的经验,话语提示将同时读取hint和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是否已打开并以编程方式更改提示。您可以使用以下方法检查“话语提示”是否打开:

  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}

答案 3 :(得分:-1)

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

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

答案 4 :(得分:-2)

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

提示 - &gt; android:提示

对于TalkBack - &gt;机器人:contentdescription

答案 5 :(得分:-4)

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

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