所以我有一个可变长度的文本,直到现在我已经用 SpannableString 填充它以突出显示特定的" hard"然后,您可以单击以在对话框中获取解释。但是因为我必须设计我的应用程序可访问性我需要orroids 对讲功能来读出这些单词(加上围绕它的文字,但我已经得到了现在)以及能够点击它们。到目前为止,我还没有找到一种方法来点击 ClickableSpan 而不会禁用对讲。
我发现ClickableSpan无法处理可访问性,但 URLSpan 是?如果是这种情况,我可以使用URLSpan打开带有自定义文本的对话框吗?或者它与我调用text.setMovementMethod(LinkMovementMethod.getInstance());
有什么关系?
提前感谢,在Accessibility上找到任何东西真的很难,但很多程序员似乎并不在乎。
答案 0 :(得分:1)
对讲用户将使用本地上下文菜单访问文字中的链接:https://support.google.com/accessibility/android/answer/6007066?hl=en
答案 1 :(得分:0)
所以我终于找到了一种方法来使用Talkback和SpannableStrings。嗯,不是真的,但这是一个解决方法。我从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
}
。为了获得视图位置和大小,我使用了以下代码:
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
}
}
});