如何确定在 TextView 中是否触摸了 link 或纯文本
How to determine if a link or plain text was touched in a TextView
我有一个可能包含可点击的 TextView link。我想向 TextView 添加一个点击侦听器,但仍然在单击 link 时,我希望它由 Linkify 正常处理。
我花了一些时间才弄明白这个问题,我想分享答案,因为它运行良好所以,享受吧!
此代码通过在 space 字符处分隔字符来遍历字符串:" "。
然后检查每个 'word' 是否有 link。
TextView textView = new TextView(context) {
@Override
public boolean onTouchEvent(MotionEvent event) {
final String text = getText().toString();
final SpannableString spannableString = new SpannableString(text);
Linkify.addLinks(spannableString, Linkify.ALL);
final URLSpan[] spans = spannableString.getSpans(0, text.length(), URLSpan.class);
final int indexOfCharClicked = getOffsetForPosition(event.getX(), event.getY()) + 1; //Change 0-index to 1-index
final String [] words = text.split(" ");
int numCharsTraversed = 0;
//Find the word that was clicked and check if it's a link
for (String word : words) {
if (numCharsTraversed + word.length() < indexOfCharClicked) {
numCharsTraversed += word.length() + 1; // + 1 for the space
} else {
for (URLSpan span : spans) {
if (span.getURL().contains(word) || word.contains(span.getURL())) {
//If the clicked word is a link, calling super will invoke the appropriate action
return super.onTouchEvent(event);
}
}
break;
}
}
//If we're here, it means regular text was clicked, not a link
doSomeAction();
return true;
}
};
我有一个可能包含可点击的 TextView link。我想向 TextView 添加一个点击侦听器,但仍然在单击 link 时,我希望它由 Linkify 正常处理。
我花了一些时间才弄明白这个问题,我想分享答案,因为它运行良好所以,享受吧!
此代码通过在 space 字符处分隔字符来遍历字符串:" "。
然后检查每个 'word' 是否有 link。
TextView textView = new TextView(context) {
@Override
public boolean onTouchEvent(MotionEvent event) {
final String text = getText().toString();
final SpannableString spannableString = new SpannableString(text);
Linkify.addLinks(spannableString, Linkify.ALL);
final URLSpan[] spans = spannableString.getSpans(0, text.length(), URLSpan.class);
final int indexOfCharClicked = getOffsetForPosition(event.getX(), event.getY()) + 1; //Change 0-index to 1-index
final String [] words = text.split(" ");
int numCharsTraversed = 0;
//Find the word that was clicked and check if it's a link
for (String word : words) {
if (numCharsTraversed + word.length() < indexOfCharClicked) {
numCharsTraversed += word.length() + 1; // + 1 for the space
} else {
for (URLSpan span : spans) {
if (span.getURL().contains(word) || word.contains(span.getURL())) {
//If the clicked word is a link, calling super will invoke the appropriate action
return super.onTouchEvent(event);
}
}
break;
}
}
//If we're here, it means regular text was clicked, not a link
doSomeAction();
return true;
}
};