【问题标题】:String is read as number rather than reading it digit by digit when talk back is on in android在 android 中打开对讲时,字符串被读取为数字,而不是逐位读取
【发布时间】:2016-02-11 07:17:33
【问题描述】:

我有一个字符串“9039662543”,当对讲打开时,这个字符串在 4.3 android 设备中被读取为“900 万......”,在 4.3 设备上它工作正常,通过读取“九零三。 ……”。我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: android string accessibility talkback accessibilityservice


    【解决方案1】:

    我假设这是一个电话号码?我不知道,因为没有格式。这是问题的核心。对此有多个修复。

    A:别管它。 TalkBack 用户可以选择按视图、段落、句子、单词、字符等来解析元素。如果用户无法通过上下文判断它是电话号码,则需要更多上下文。数字本身很好!

    B:更好地格式化它。 (903)-966-2542 vs 9039662543,没有任何额外的上下文,是两条不同的信息。它可能仍会读作“括号九百零三......”,但更明显的是它是一个电话号码,并且这些块很容易跟踪。抱歉,我没有 4.3 之前的设备来查看实际公告是什么。

    C:覆盖内容描述。如果文本表示为:

    文字:9039662543 内容说明:9 0 3 9 6 6 2 5 4 3

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

    【讨论】:

      【解决方案2】:

      对于 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 ")
          }
      })
      

      【讨论】:

      • 我喜欢这个解决方案,我们可以在不同的情况下使用它,比如说合同号。 val contractNumber = "64583658" val text = "Contract Number $contractNumber" val contentDescriptionText = "Contract Number ${contractNumber.replace(".".toRegex(),"$0 ")}" 更何况它很容易实现。
      【解决方案3】:
      //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 在选项 C 中已经建议了这一点,我同意这将是最不理想的解决方案。它不仅会减慢屏幕阅读器的速度,还会使盲文设备在数字之间显示一堆空格。
      【解决方案4】:

      虽然我看到很多人推荐 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

      【讨论】:

        【解决方案5】:

        确保edittext上的输入类型是电话而不是数字:

        android:inputType="phone"
        

        而不是:

        android:inputType="number"
        

        【讨论】:

        • 有时你想要一个数字键盘但内容是电话号码,所以这行不通。
        【解决方案6】:

        我知道它已经得到回答,但受到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:我无法在他/她的回答下发布这个,因为我没有足够的声誉。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • @GeorgeZ。答案是“您可以添加零宽度不间断空格字符“\ufeff”以不可见地分隔数字。”,同时提供链接以供参考。这不是仅链接的答案。
          猜你喜欢
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          • 2010-11-08
          • 1970-01-01
          • 2013-12-17
          • 1970-01-01
          • 2014-11-22
          相关资源
          最近更新 更多