代码之家  ›  专栏  ›  技术社区  ›  Aram Becker

我如何使用带有clickableSpan的Androids Talkback?

  •  4
  • Aram Becker  · 技术社区  · 9 年前

    所以我有一个可变长度的文本,直到现在,我用 可跨越字符串 要突出显示特定的“硬”字,您可以单击以在对话框中获得解释。但因为我必须为 可访问性 我需要机器人 反馈 功能可以读出这些单词(加上周围的文字,但我现在已经知道了),还可以单击它们。到目前为止,我还没有找到一种方法来点击 可单击范围 而不禁用对讲。

    我发现ClickableSpan无法处理Acessibility,但 URLSpan(URLSpan) 是如果是这样,我可以用URLSpan打开带有自定义文本的对话框吗?还是跟我打电话有关 text.setMovementMethod(LinkMovementMethod.getInstance()); ?

    提前感谢,很难在Accessibility上找到任何东西,很多程序员似乎不太在意。

    3 回复  |  直到 9 年前
        1
  •  1
  •   user6036389    8 年前

    对讲用户将使用本地上下文菜单访问文本中的链接: https://support.google.com/accessibility/android/answer/6007066?hl=en

        2
  •  1
  •   Dharmesh Baldha    5 年前

    也许这可能是最简单的解决方案……它对我有用。

    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ClassroomLog.log(TAG, "Textview Click listener ");
            if (textView.getSelectionStart() == -1 && textView.getSelectionEnd() == -1) {
                // Perform your action here
            }
        }
    });
    
        3
  •  0
  •   Aram Becker    9 年前

    因此,我终于找到了一种方法来使用带SpannableStrings的Talkback。嗯,不是真的,但这是一个变通办法。我删除了 ClickableSpan 来自 TextView 但存储了开始和结束位置,并将textView放到另一个布局中。

    然后,我遍历了存储的位置,并在文本顶部添加了一个拟合的空视图 ContentDescription 以及 onClick 我需要的财产 onClickListener 。为了获得视图位置和大小,我使用了以下代码:

    //clickableSpans is an int[] Array with the start and end character positions of the previous clickableSpans stored after each other
    
    for (int i = 0; i < clickableSpans.length; i +=2) {
        int width= (int) (layout.getPrimaryHorizontal(clickableSpans[i+1]) - (int) layout.getPrimaryHorizontal(clickableSpans[i]));
        int height= layout.getLineBottom(layout.getLineForOffset(clickableSpans[i])) - layout.getLineTop(layout.getLineForOffset(clickableSpans[i]));
    
        int xOffset = (int) layout.getPrimaryHorizontal(clickableSpans[i]);
        int yOffset = layout.getLineTop(layout.getLineForOffset(clickableSpans[i]));
    
        //Now position an empty View according to those values
    }