Есть ли стандартный способ, чтобы ссылки и номера телефонов можно было нажимать в TextView?
Я уже знаю, как использовать TextView для автоматического создания интерактивных ссылок для веб-адресов, телефонных номеров и т. Д. У меня вопрос, когда у вас есть HTML с hrefs в нем, а также номера телефонов, и вы хотите, чтобы оба кликабельных, есть ли лучше или больше стандартный способ сделать это? Вот что у меня есть:
String text = "Click <a href=\"http://stackru.com\">Stackru</a> or call 1-234-567-8901.";
TextView textView = getTextView();
textView.setLinksClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(Html.fromHtml(text));
// This is a pretty primitive US-centric phone number REGEX but it works
Linkify.addLinks(textView, Pattern.compile("(1?[-. ])?\\d\\d\\d([-. ])\\d\\d\\d\\2\\d\\d\\d\\d"), "tel:");
Этот код работает, но не кажется идеальным. Я НЕ вызываю setAutoLinkMask(Linkify.PHONE_NUMBERS), потому что он будет игнорировать href в HTML и уничтожит Spannables, которые Html.fromHtml добавляет даже при создании Linkify.WEB_URLS.
По крайней мере, я хотел бы использовать более надежный или стандартный REGEX для телефонных номеров. Я думаю, что-то вроде Patterns.PHONE будет, по крайней мере, лучшим регулярным выражением. Тем не менее, я надеюсь, что есть более элегантное решение, чем то, что у меня есть выше.
1 ответ
Вы можете использовать Cutom LinkMovementMethod
реализация. Как это:
public class CustomLinkMovementMethod extends LinkMovementMethod {
private static CustomLinkMovementMethod linkMovementMethod = new BayerLinkMovementMethod();
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
if (link.length != 0) {
String url = link[0].getURL();
if (url.startsWith("http://") || url.startsWith("https://")) {
//do anything you want
} else if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL,
Uri.parse(url));
widget.getContext().startActivity(intent);
return true;
} else if (url.startsWith("mailto:")) {
Intent intent = new Intent(Intent.ACTION_SENDTO,
Uri.parse(url));
widget.getContext().startActivity(intent);
return true;
}
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
public static MovementMethod getInstance() {
return linkMovementMethod;
}
}