Tôi đã triển khai giải pháp theo ý kiến của mình, thanh lịch hơn. Tôi đã thực hiện tùy chỉnh TextView
. Bằng cách này, bạn không cần phải thực thi mã bổ sung cho mỗi TextView
với siêu liên kết.
package com.example.view;
import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.URLSpan;
import android.util.AttributeSet;
import com.example.utils.UrlSpanNoUnderline;
public class TextViewNoUnderline extends AppCompatTextView {
public TextViewNoUnderline(Context context) {
this(context, null);
}
public TextViewNoUnderline(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public TextViewNoUnderline(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setSpannableFactory(Factory.getInstance());
}
private static class Factory extends Spannable.Factory {
private final static Factory sInstance = new Factory();
public static Factory getInstance() {
return sInstance;
}
@Override
public Spannable newSpannable(CharSequence source) {
return new SpannableNoUnderline(source);
}
}
private static class SpannableNoUnderline extends SpannableString {
public SpannableNoUnderline(CharSequence source) {
super(source);
}
@Override
public void setSpan(Object what, int start, int end, int flags) {
if (what instanceof URLSpan) {
what = new UrlSpanNoUnderline((URLSpan) what);
}
super.setSpan(what, start, end, flags);
}
}
}
Và mã cho UrlSpanNoUnderline:
package com.jankstudios.smmagazine.utils;
import android.text.TextPaint;
import android.text.style.URLSpan;
public class UrlSpanNoUnderline extends URLSpan {
public UrlSpanNoUnderline(URLSpan src) {
super(src.getURL());
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
Nguồn
2015-11-06 10:32:57
giải pháp này giả định văn bản của nhịp cũng giống như URL, đó là trường hợp cho liên kết http: // cơ bản. Tuy nhiên, Linkify là thông minh và chuyển đổi một số điện thoại như (212) 555-1212 vào URL 'tel: 2125551212'. Cuộc gọi 'URLSpanNoUnderline' mới sẽ được chuyển qua' span.getURL() 'để giữ lại thông tin này, nếu không bạn tạo các liên kết xấu gây ra ngoại lệ khi được nhấp. Tôi đã đặt giải pháp được đề xuất này trong hàng đợi chỉnh sửa cho câu trả lời của bạn vì tôi không có quyền chỉnh sửa. –
Chúc mừng Mike. Tôi đã chấp thuận chỉnh sửa của bạn, lần đầu tiên tôi từng thấy * hộp thoại chỉnh sửa đó, hy vọng nó hoạt động. –
"Văn bản của span giống với URL" nghĩa là gì? –