android TextView respectively identifying the plurality of click to jump url

实现方案:
private String pattern =
"((http|ftp|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?|(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?";

Pattern r = Pattern.compile(pattern);
Matcher m;
mTv.setText(identifyUrl(richURL.msg));

SpannableStringBuilderForAllvers identifyUrl public (CharSequence text) { 
CharSequence contextText;
CharSequence clickText;
text == null text = "": text;?
// The following have been present for splicing spanText
SpannableStringBuilderForAllvers span = new new SpannableStringBuilderForAllvers (text);
ClickableSpan [] = clickableSpans span.getSpans (0, text.length (), ClickableSpan.class);
IF (clickableSpans.length> 0) {
int Start = 0;
int End = 0;
for (int I = 0; I <clickableSpans.length; I ++ ) {
Start = span.getSpanStart (clickableSpans [0]);
End = span.getSpanEnd (clickableSpans [I]);
}
// clickable text that follows the page content
contextText = text.subSequence(end, text.length());
//可点击文本
clickText = text.subSequence(start, end);
} else {
contextText = text;
clickText = null;
}
m = r.matcher(contextText);
//匹配成功
while (m.find()) {
//得到网址数m.group()
if (m.start() < m.end()) {
span.setSpan(new LinkClickSpan(m.group(), m.group(), mUrlSpanClickListener),
m.start(), m.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
return span;
}

private static final String HTTPS = "https://";
private static final String HTTP = "http://";
private static final String FTP = "ftp://";

public static boolean hasNetUrlHead(String url) {
return (!TextUtils.isEmpty(url)) && (url.startsWith(HTTP) || url.startsWith(HTTPS) || url.startsWith(FTP));
}

private UrlSpanClickListener mUrlSpanClickListener = new UrlSpanClickListener() {
@Override
public void onClick(View view, String url, String content) {
if (TextUtils.isEmpty(url)) {
return;
}
Matcher url_matcher = Patterns.WEB_URL.matcher(url);
if (url_matcher.matches()) {
String tempUrl;
if (hasNetUrlHead(url)) {
tempUrl = url;
} else {
tempUrl = HTTPS + url;
}
//通过webview打开相应的url

//Bundle bundle = new Bundle();
//bundle.putString(WebCordovaBaseFragment.EXTRA_URL, tempUrl);
//bundle.putBoolean(WebCordovaBaseFragment.ENABLE_WEB_TITLE, true);
//WebViewActivity.presentWeb(Utilities.getApplicationContext(), WebViewActivity.class, WebCommonFragment.class, content, bundle);
}
}
};

public interface UrlSpanClickListener {
void onClick(View view, String url, String content);
}

public static class LinkClickSpan extends ClickableSpan {
private int mColor = Utilities.getApplicationContext().getResources().getColor(R.color.yc_color_007AFF_CBN);
private String mUrl;
private String mContent;
UrlSpanClickListener mClickListener;

public LinkClickSpan(String url, String content, UrlSpanClickListener onClickListener) {
super();
mUrl = url;
mContent = content;
mClickListener = onClickListener;
}

@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(mColor);
ds.linkColor = mColor;
ds.setUnderlineText(true);//设置是否下划线
ds.clearShadowLayer();
}

@Override
public void onClick(View widget) {
if (mClickListener != null) {
mClickListener.onClick(widget, mUrl, mContent);
}
}
}


public class SpannableStringBuilderForAllvers extends SpannableStringBuilder{

public SpannableStringBuilderForAllvers() {
super("");
}
public SpannableStringBuilderForAllvers(CharSequence text) {
super(text, 0, text.length());
}
public SpannableStringBuilderForAllvers(CharSequence text, int start, int end){
super(text,start,end);
}

@Override
public SpannableStringBuilder append(CharSequence text) {
if (text == null) {
return this;
}
int length = length();
return (SpannableStringBuilderForAllvers)replace(length, length, text, 0, text.length());
}

/ ** This method supports only the original API which API21 or more, where low adaptive version * /
public SpannableStringBuilderForAllvers the append (CharSequence text, What Object, int the flags) {
IF (text == null) {
return the this;
}
int = Start length ();
the append (text);
setSpan (What, Start, length (), the flags);
return the this;
}
}


public class ClickableSpanTextView extends AppCompatTextView {

private BackgroundColorSpan backgroundColorSpan;
private boolean hasSpan;

public ClickableSpanTextView(Context context) {
super(context);
init();
}

public ClickableSpanTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public ClickableSpanTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init() {
setMovementMethod(LinkMovementMethod.getInstance());
backgroundColorSpan = new BackgroundColorSpan(getContext().getResources().getColor(R.color.yc_color_4B4B4B_CDG));
}

@Override
public boolean onTouchEvent(MotionEvent event) {
boolean handled = super.onTouchEvent(event);
int action = event.getAction();

if (!(getText() instanceof Spannable)) {
return handled;
}

Spannable spannable = (Spannable) getText();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
y -= getTotalPaddingTop();
x += getScrollX();
y += getScrollY();
Layout layout = getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
if (off >= getText().length()) {
int off1 = layout.getOffsetForHorizontal(line, x - getTextSize());
if (off == off1) {
return handled;
}
}

ClickableSpan[] links = spannable.getSpans(off, off, ClickableSpan.class);
if (links.length > 0) {
ClickableSpan clickableSpan = links[0];
int start = spannable.getSpanStart(clickableSpan);
int end = spannable.getSpanEnd(clickableSpan);

if (action == MotionEvent.ACTION_DOWN && !hasSpan) {
spannable.setSpan(backgroundColorSpan, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
hasSpan = true;
} else if (hasSpan) {
spannable.removeSpan(backgroundColorSpan);
hasSpan = false;
}
}
return links.length != 0;
} else {
if (hasSpan && action != MotionEvent.ACTION_MOVE) {
spannable.removeSpan(backgroundColorSpan);
hasSpan = false;
}
}
return handled;
}
}




Guess you like

Origin www.cnblogs.com/wangqiong/p/11412269.html