【发布时间】:2016-07-11 18:49:12
【问题描述】:
我有一个文本视图,其中包含多个可点击的跨度。我希望能够测试单击这些跨度。
我尝试设置一个自定义 ViewAction,它会在 TextView 中找到可点击的跨度,然后将它们的文本与所需的文本匹配,然后单击该文本的 xy 坐标。但是,似乎添加到 TextView 的跨度不是 ClickableSpan 类型,而是添加跨度的片段。
因此,我无法区分链接跨度。有没有更好的方法来做到这一点?
添加跨度:
Util.addClickableSpan(spannableString, string, linkedString, new ClickableSpan() {
@Override
public void onClick(View textView) {}
});
tvAcceptTc.setText(spannableString);
tvAcceptTc.setMovementMethod(LinkMovementMethod.getInstance());
实用方法:
public static void addClickableSpan(SpannableString spannableString,
String text,
String subText,
ClickableSpan clickableSpan) {
int start = text.indexOf(subText);
int end = text.indexOf(subText) + subText.length();
int flags = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
spannableString.setSpan(clickableSpan, start, end, flags);
}
定义 ViewAction:
@Override
public void perform(UiController uiController, View view) {
uiController.loopMainThreadUntilIdle();
if (view instanceof TextView) {
TextView textView = (TextView) view;
Layout textViewLayout = textView.getLayout();
SpannableString fullSpannable = new SpannableString(textView.getText());
Object[] spans = fullSpannable.getSpans(0, fullSpannable.length(), Object.class);
ClickableSpan span = null;
for (Object object : spans) {
if (object instanceof BaseFragment) {
ClickableSpan foundSpan = (ClickableSpan)object;
int spanStart = fullSpannable.getSpanStart(foundSpan);
int spanEnd = fullSpannable.getSpanEnd(foundSpan);
if (fullSpannable.subSequence(spanStart, spanEnd).equals(aSubstring)) {
//Found the correct span!
span = foundSpan;
}
}
} ... go on to click the xy-coordinates
【问题讨论】:
-
如何添加跨度?你试过打电话给
TextUtils#dumpSpans吗? -
我添加了用于添加跨度的代码。如果我删除 instanceof 检查和强制转换,它现在实际上可以工作,但它会找到带有文本的任何跨度,而不仅仅是 ClickableSpan。我查看了调试器中的跨度,它们都不是 ClickableSpan 类型,而是来自添加跨度的片段。
-
查看
getSpans的最后一个参数 -
你是说把 ClickableSpan 放在那里? spans 数组并没有带回任何 ClickableSpans,所以它不会只返回一个空数组吗?
-
你尝试调用 dumpSpans 了吗?
标签: android testing android-espresso