如何使用ClickableSpan使用Androids Talkback?

时间:2015-08-20 21:43:08

标签: android accessibility clickable spannablestring talkback

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

我发现ClickableSpan无法处理可访问性,但 URLSpan 是?如果是这种情况,我可以使用URLSpan打开带有自定义文本的对话框吗?或者它与我调用text.setMovementMethod(LinkMovementMethod.getInstance());有什么关系?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

所以我终于找到了一种方法来使用Talkback和SpannableStrings。嗯,不是真的,但这是一个解决方法。我从ClickableSpan中移除了TextView,但存储了起始位置和结束位置,并将textView放入另一个布局中。

然后我遍历存储的位置并在文本顶部添加了空视图,其中包含ContentDescriptiononClick所需的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 } 。为了获得视图位置和大小,我使用了以下代码:

    public void plot(double[] xArr, double[] yExactArr, double[] yApproxArr) {
        linePlot.getData().clear();

        if (!exactValues.getData().isEmpty()) {
            exactValues.getData().remove(0, xArr.length - 1);
            approxValues.getData().remove(0, xArr.length - 1);
        }

        for (int i = 0; i < xArr.length; i++) {
            exactValues.getData().add(new XYChart.Data(xArr[i], yExactArr[i]));
            approxValues.getData().add(new XYChart.Data(xArr[i], yApproxArr[i]));
        }


        linePlot.getData().addAll(exactValues, approxValues);
        mainStage.show();
    }

答案 2 :(得分:0)

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

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
        }
    }
});
相关问题