欢迎光临企业官网建站网站,提供自助建设系统平台服务

企业官网建站

专业为公司品牌推广建设网站

TextView富文本学习二(获取html代码片段中的超链接地址,设置点击事件,并设置连接样式)

作者:jcmp      发布时间:2021-05-08      浏览量:0
一、1 利用SpannableStrin

一、1 利用SpannableStringBuilder获取存在的Span。

getSpans可以获取SpannableStringBuilder中被设置的Span数组,参数说明: queryStart:开始位置 queryEnd:结束位置 kind:span对应的Class。

例子:

setContentView(R.layout.activity_urlspan_click); mTextView = findViewById(R.id.textview); SpannableStringBuilder spannableStringBuilder1 = new SpannableStringBuilder("测试富文本样式设"); ForegroundColorSpan fspan1 = new ForegroundColorSpan(Color.RED); spannableStringBuilder1.setSpan(fspan1,4,8, Spanned.SPAN_INCLUSIVE_INCLUSIVE); SpannableString textSpanned1 = new SpannableString("置字体颜色设置"); ForegroundColorSpan fspan2 = new ForegroundColorSpan(Color.BLUE); textSpanned1.setSpan(fspan2,0,textSpanned1.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); spannableStringBuilder1.append(textSpanned1); mTextView.setText(spannableStringBuilder1); ForegroundColorSpan[] spans = spannableStringBuilder1.getSpans(0, spannableStringBuilder1.length(), ForegroundColorSpan.class); System.out.println("========spans.length========"+spans.length); System.out.println("========SpanStart========"+spannableStringBuilder1.getSpanStart(spans[0])); System.out.println("========SpanEnd========"+spannableStringBuilder1.getSpanEnd(spans[0])); System.out.println("========SpanFlags========"+spannableStringBuilder1.getSpanFlags(spans[0])); System.out.println("========SpanStart========"+textSpanned1.getSpanStart(spans[1])); System.out.println("========SpanEnd========"+textSpanned1.getSpanEnd(spans[1])); System.out.println("========SpanFlags========"+textSpanned1.getSpanFlags(spans[1]));

result: ========spans.length========2 ========SpanStart========4 ========SpanEnd=======15 ========SpanFlags=======18 ========SpanStart=======0 ========SpanEnd=======7 ========SpanFlags=======18。

获取到两个设置的ForegroundColorSpan,然后可以利用获取到的ForegroundColorSpan得到调用setSpan时的信息。

二、2 利用URLSpan和ClickableSpan给html代码片段超链接设置点击。

给html中的超链接设置点击事件:

public class URLSpanClickActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_urlspan_click); mTextView = findViewById(R.id.textview); /*SpannableStringBuilder spannableStringBuilder1 = new SpannableStringBuilder("测试富文本样式设"); ForegroundColorSpan fspan1 = new ForegroundColorSpan(Color.RED); spannableStringBuilder1.setSpan(fspan1,4,8, Spanned.SPAN_INCLUSIVE_INCLUSIVE); SpannableString textSpanned1 = new SpannableString("置字体颜色设置"); ForegroundColorSpan fspan2 = new ForegroundColorSpan(Color.BLUE); textSpanned1.setSpan(fspan2,0,textSpanned1.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); spannableStringBuilder1.append(textSpanned1); mTextView.setText(spannableStringBuilder1); ForegroundColorSpan[] spans = spannableStringBuilder1.getSpans(0, spannableStringBuilder1.length(), ForegroundColorSpan.class); System.out.println("========spans.length========"+spans.length); System.out.println("========SpanStart========"+spannableStringBuilder1.getSpanStart(spans[0])); System.out.println("========SpanEnd========"+spannableStringBuilder1.getSpanEnd(spans[0])); System.out.println("========SpanFlags========"+spannableStringBuilder1.getSpanFlags(spans[0])); System.out.println("========SpanStart========"+textSpanned1.getSpanStart(spans[1])); System.out.println("========SpanEnd========"+textSpanned1.getSpanEnd(spans[1])); System.out.println("========SpanFlags========"+textSpanned1.getSpanFlags(spans[1]));*/ mTextView.setMovementMethod(LinkMovementMethod.getInstance()); String originalStr = "url 跳转的测试
" + "百度
\n" + "W3School"; CharSequence stringBuilder = getClickableHtml(originalStr); mTextView.setText(stringBuilder); } private CharSequence getClickableHtml(String html) { Spanned spannedHtml = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { spannedHtml = Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT); } else { spannedHtml = Html.fromHtml(html); } SpannableStringBuilder clickableBuilder = new SpannableStringBuilder(spannedHtml); URLSpan[] urls = clickableBuilder.getSpans(0, spannedHtml.length(), URLSpan.class); if (urls.length == 0){ return html.replace("\\n", "\n").replace("\\r", "\r"); } //获取所有的URL for (final URLSpan span : urls) { setLinkClickable(clickableBuilder, span); } return clickableBuilder; } //必须设置setMovementMethod(LinkMovementMethod.getInstance());ClickableSpan才会生效 private void setLinkClickable(final SpannableStringBuilder clickableHtmlBuilder, final URLSpan urlSpan) { int start = clickableHtmlBuilder.getSpanStart(urlSpan); int end = clickableHtmlBuilder.getSpanEnd(urlSpan); int flags = clickableHtmlBuilder.getSpanFlags(urlSpan); ClickableSpan clickableSpan = new ClickableSpan() { public void onClick(View view) { //可以获取html代码中的url地址,然后根据需要跳转特定页面 String url = urlSpan.getURL(); Toast.makeText(URLSpanClickActivity.this,"跳转url"+url,Toast.LENGTH_SHORT).show(); } public void updateDrawState(TextPaint ds) { //设置字体颜色 ds.setColor(Color.RED); //去掉下划线 ds.setUnderlineText(false); } }; clickableHtmlBuilder.setSpan(clickableSpan, start, end, flags); }}