如何在textView和自定义URLSpan中一起使用autoLink?

时间:2014-03-28 17:44:15

标签: android regex textview autolink urlspan

我有一个像这样的textView:

<TextView
  android:id="@+id/note_viewer"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:autoLink="email|web|phone"
  android:textSize="15sp" />

这样的Spannable字符串:

String input = note.getText();
SpannableStringBuilder builder = new SpannableStringBuilder(input);
Pattern pattern = Pattern.compile(XTAG_PATTERN);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
  int start = matcher.start();
  int end = matcher.end();
  String text = input.subSequence(start, end).toString();
  ClickableURLSpan url = new ClickableURLSpan(text, getActivity()
    .getApplicationContext(), this);
  builder.setSpan(url, start, end, 0);
}
noteView.setText(builder);
noteView.setMovementMethod(LinkMovementMethod.getInstance());

这样的自定义`URLSpan类:

public class ClickableURLSpan extends URLSpan {
  Context context;
  NoteViewFragment noteViewFragment;
  public ClickableURLSpan(String url,Context c, NoteViewFragment noteViewFragment) {
    super(url);
    context=c;
    this.noteViewFragment=noteViewFragment;
}
@Override
public void onClick(View widget) {
  String clickedText = getURL();
  Intent i=new Intent(context,SearchActivity.class);
  i.putExtra("tag", clickedText);
  noteViewFragment.startActivity(i);
}}

但是当我使用自动链接时,我的自定义可点击范围不起作用。如何同时使用自动链接和我自己的可点击范围?

1 个答案:

答案 0 :(得分:1)

将可传输字符串更改为:

            String input = note.getText();
            Spannable spannable = new SpannableString(Html.fromHtml(input));
            Pattern pattern = Pattern.compile(XTAG_PATTERN);

            Linkify.addLinks(spannable, pattern, "");
            URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
            for (URLSpan urlSpan : spans) {
                ClickableURLSpan linkSpan = new ClickableURLSpan(text, getActivity().getApplicationContext(), this);
                int spanStart = spannable.getSpanStart(urlSpan);
                int spanEnd = spannable.getSpanEnd(urlSpan);
                spannable.setSpan(linkSpan, spanStart, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                spannable.removeSpan(urlSpan);
            }
            textview.setMovementMethod(EnhancedLinkMovementMethod.getInstance());
            noteView.setText(spannable, TextView.BufferType.SPANNABLE);