【发布时间】:2016-02-11 07:17:33
【问题描述】:
我有一个字符串“9039662543”,当对讲打开时,这个字符串在 4.3 android 设备中被读取为“900 万......”,在 4.3 设备上它工作正常,通过读取“九零三。 ……”。我应该怎么做才能解决这个问题?
【问题讨论】:
标签: android string accessibility talkback accessibilityservice
我有一个字符串“9039662543”,当对讲打开时,这个字符串在 4.3 android 设备中被读取为“900 万......”,在 4.3 设备上它工作正常,通过读取“九零三。 ……”。我应该怎么做才能解决这个问题?
【问题讨论】:
标签: android string accessibility talkback accessibilityservice
我假设这是一个电话号码?我不知道,因为没有格式。这是问题的核心。对此有多个修复。
A:别管它。 TalkBack 用户可以选择按视图、段落、句子、单词、字符等来解析元素。如果用户无法通过上下文判断它是电话号码,则需要更多上下文。数字本身很好!
B:更好地格式化它。 (903)-966-2542 vs 9039662543,没有任何额外的上下文,是两条不同的信息。它可能仍会读作“括号九百零三......”,但更明显的是它是一个电话号码,并且这些块很容易跟踪。抱歉,我没有 4.3 之前的设备来查看实际公告是什么。
C:覆盖内容描述。如果文本表示为:
文字:9039662543 内容说明:9 0 3 9 6 6 2 5 4 3
我建议不要使用这种方法。这两个值不一样。仅仅因为您对公告感到不舒服并不意味着 TalkBack 用户会感到不舒服。当您习惯使用 TalkBack 时,您就会习惯于切换到不同的文本解析模式。不关心电话号码的用户会因分离版本的读取速度较慢而感到沮丧。让他们选择忽略它,让它以更压缩的形式迅速消失。此外,如果没有上下文,这两个数字并不真正代表同一事物。在这种情况下,解决方案是提供此上下文而不是更改演示文稿。分开不等于。
【讨论】:
对于 EditText,在字符之间添加一个空格并在 Accessibility Node Info 中设置此文本。
ViewCompat.setAccessibilityDelegate(editText,object : AccessibilityDelegateCompat(){
override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = editText.text.toString().replace(".".toRegex(),"$0 ")
}
})
【讨论】:
//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);
【讨论】:
虽然我看到很多人推荐 ChrisCM 发布的内容。我看到默认的联系人应用程序这样做不同。
默认联系人应用程序会逐位读取电话号码。它还可以做更多的事情,并且可以重复使用。使用的 API 是:
它的工作原理可以在这里找到:
【讨论】:
确保edittext上的输入类型是电话而不是数字:
android:inputType="phone"
而不是:
android:inputType="number"
【讨论】:
我知道它已经得到回答,但受到this answer 的启发 我为 textView 编写了一个扩展函数(当然是在 Kotlin 中),它可以被可能有这个问题的人重新用作一个实用函数。
fun TextView.separateText() {
val textView = this
ViewCompat.setAccessibilityDelegate(textView, object : AccessibilityDelegateCompat() {
override fun onInitializeAccessibilityNodeInfo(
host: View,
info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = textView.text.toString().replace(".".toRegex(), "$0 ")
}
})
}
PS:我无法在他/她的回答下发布这个,因为我没有足够的声誉。
【讨论】:
您可以添加零宽度不间断空格字符“\ufeff”以不可见地分隔数字。它会将数字读取为数字。请参阅以下链接中的评论以获取更多详细信息 How to change Android Talkback in case of App name
【讨论】: