当在android中进行回调时,字符串被读作数字而不是逐位读取

时间:2016-02-11 07:17:33

标签: android string accessibility talkback accessibilityservice

我有一个字符串" 9039662543",当回话开启时,此字符串被读为"九百万...."在4.3 Android设备中,4.3以上的设备工作正常,通过阅读"九零三......"。我该怎么做才能解决这个问题?

6 个答案:

答案 0 :(得分:6)

我假设这是一个电话号码?我不能说,因为没有格式化。这是问题的核心。对此有多种修复方法。

答:不管它。 TalkBack用户可以选择按视图,段落,句子,单词,字符等解析元素。如果用户无法通过上下文告诉他们电话号码,则需要更多上下文。这个数字很好!

B:更好地格式化。 (903)-966-2542 vs 9039662543,没有任何其他上下文,是两个不同的信息。它仍然可以读出类似于"圆括号9-hundread和3 ........"但更明显的是它是一个电话号码,而且这些块很容易跟踪。对不起,我没有预先设备4.3来检查实际的公告是什么。

C:覆盖内容说明。如果文本表示为:

文字:9039662543 内容简述:9 0 3 9 6 6 2 5 4 3

我建议不要采用这种方法。这两个值不一样。仅仅因为你对公告感到不舒服并不代表一个TalkBack用户会是这样。当您习惯使用TalkBack时,您将习惯于切换到不同的文本解析模式。不关心电话号码的用户会因分离版本的较慢读出而感到沮丧。让他们选择忽略它,并以更加压缩的形式迅速吹响它。另外,如果没有上下文,那么这两个数字实际上并不代表相同的事情。在这种情况下的解决方案是提供此上下文而不是更改演示文稿。分开是不相等的。

答案 1 :(得分:0)

当我看到很多人推荐ChrisCM发布的内容时,我看到默认的联系人应用程序会以不同的方式进行操作。

默认的联系人应用程序会逐位读取电话号码。它还做得更多,并且可以重用。使用的API是:

https://developer.android.com/reference/android/telephony/PhoneNumberUtils.html#createTtsSpan(java.lang.String)

此操作的详细信息可以在此处的代码中找到:

https://android.googlesource.com/platform/frameworks/base/+/master/telephony/java/android/telephony/PhoneNumberUtils.java

答案 2 :(得分:0)

您可以添加零宽度的不间断空格字符“ \ ufeff”,以不可见的方式分隔数字。它将数字读取为数字。请参阅以下链接中的评论以获取更多详细信息 How to change Android Talkback in case of App name

答案 3 :(得分:0)

确保编辑文本上的输入类型是电话而不是数字:

android:inputType="phone"

而不是:

android:inputType="number"

答案 4 :(得分:0)

对于EditText,请在字符之间添加一个空格,然后在“辅助功能节点信息”中设置此文本。

ViewCompat.setAccessibilityDelegate(editText,object : AccessibilityDelegateCompat(){
    override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
        super.onInitializeAccessibilityNodeInfo(host, info)
        info.text = editText.text.toString().replace(".".toRegex(),"$0 ")
    }
})

答案 5 :(得分:-1)

//add extra space to text and set that text as contentDescription
textView.setText(readbleText);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < readbleText.length(); i++) {
builder.append(readbleText.charAt(i));
builder.append("\u00A0");
}
textView.setContentDescription(builder);