如何将 Androids Talkback 与 clickableSpan 一起使用?

How can I use Androids Talkback with clickableSpan?

所以我有一个可变长度的文本,直到现在我已经用 SpannableString 填充它以突出显示特定的 "hard" 单词,然后您可以单击以获取对话框中的解释。但是因为我必须为 accessibility 设计我的应用程序,所以我需要 androids Talkback 功能来读出这些词(加上它周围的文本,但我'现在已经知道了)以及能够点击它们。到目前为止,我还没有找到一种方法,甚至可以在不禁用 Talkback 的情况下单击 ClickableSpan

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

提前致谢,在辅助功能上很难找到任何东西,似乎没有多少程序员很关心。

所以我终于找到了一种将 Talkback 与 SpannableStrings 一起使用的方法。好吧,不是真的,但这是一种解决方法。我从 TextView 中删除了 ClickableSpan 但存储了开始和结束位置并将 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
}

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

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

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
        }
    }
});