有时候我们需要在一些消息里面带有 可以点击的链接,我们可以用下面的方法拦截链接的点击事件,如果不进行拦截,点击textView里面的链接就会直接跳到外部浏览器打开链接。
搞懂里面的原理要先了解SpannableString 这个类的用法,可以参考 用SpannableString打造绚丽多彩的文本显示效果
懂了SpannableString之后除了下面代码的功能外,还可以自定义更多的效果和功能。
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class HtmlActivity extends AppCompatActivity {
private TextView tvTit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_html);
tvTit =findViewById(R.id.tit) ;
setInitTvTit(tvTit);
}
private void setInitTvTit(TextView tvTit){
String html="\n" +
"<font color=\"#222222\">欢迎使用小游戏APP。在您使用本APP前,请仔细阅读<font color=\"#FF9800\"><a href= \"https://baidu.com/agreement.html\">《用户协议》</a ></font>和<font color=\"#FF9800\"><a href=\"tel:10086\">10086</a ></font>的全部内容,同意并接受全部条款后开始使用我们的产品和服务。我们会严格按照政策内容使用和保护您的个人信息,感谢您的信任。<br/><br/>若您同意以上用户协议和隐私协议保护政策,请点击“同意”并开始使用我们的产品和服务。</font>";
tvTit.setText(getClickableHtml(Html.fromHtml(html)));
tvTit.setMovementMethod(LinkMovementMethod.getInstance());
tvTit.setHighlightColor(Color.TRANSPARENT);
}
private void setLinkClickable(final SpannableStringBuilder clickableHtmlBuilder, final URLSpan urlSpan) {
int start = clickableHtmlBuilder.getSpanStart(urlSpan);
int end = clickableHtmlBuilder.getSpanEnd(urlSpan);
int flags = clickableHtmlBuilder.getSpanFlags(urlSpan);
Log.e("HtmlActivity :","start : "+start+" end :"+end+" flags :"+flags);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
String originUrl = urlSpan.getURL();//获取url地址
//do something
Toast.makeText(HtmlActivity.this,originUrl,Toast.LENGTH_SHORT).show();
Log.i("HtmlActivity :","originUrl : "+originUrl);
}
};
clickableHtmlBuilder.setSpan(clickableSpan, start, end, flags);
}
private CharSequence getClickableHtml(Spanned spannedHtml) {
SpannableStringBuilder clickableHtmlBuilder = new SpannableStringBuilder(spannedHtml);
URLSpan[] urls = clickableHtmlBuilder.getSpans(0, spannedHtml.length(), URLSpan.class);
for (final URLSpan span : urls){
setLinkClickable(clickableHtmlBuilder, span);
}
return clickableHtmlBuilder;
}
}