Android:借用html标签协议,定义自己的协议
背景
使用html,定制自己的标签协议:比如:
今日有好货,<a href="https://www.taobao.com">点我逛淘宝</a>,有惊喜!!
或者
今日有好货,<a href="page://taobao_home">点我逛淘宝</a>,有惊喜!!
当一个TextView显示上述内容时,还可以点击上面的文字,然后跳转到对应的页面。
解决思路
使用Html.fromHtml
对含有标签的文本进行解析,然后重新为其添加自定义的Span
...
/**
* 绑定解析的Html
*
* @param mContentTv 目标的TextView控件
* @param content 含有html标签的文本内容
*/
private void bindContentView(final TextView mContentTv, final String content) throws Throwable {
mContentTv.setMovementMethod(LinkMovementMethod.getInstance());
String text = mContentTv.getText().toString();
//解析html
Spanned spanned = Html.fromHtml(content);
//获取其中的URL链接的Span
URLSpan[] spans = spanned.getSpans(0, content.length(), URLSpan.class);
if (spans != null) {
//转化为子类
SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;
for (URLSpan urlSpan : spans) {
//获取span的起始位置
int start = spanned.getSpanStart(urlSpan);
int end = spanned.getSpanEnd(urlSpan);
int flag = spanned.getSpanFlags(urlSpan);
//获取href的链接
final String pageName = urlSpan.getURL();
spannableStringBuilder.removeSpan(urlSpan);
if (start > end || start < 0) {
continue;
}
//设置点击事件
spannableStringBuilder.setSpan(new ColorClickableSpan() {
@Override
public void onClick(View view) {
//to open the pageName here
}
}, start, end, flag);
}
mContentTv.setText(spannableStringBuilder);
} else {
mContentTv.setText(spanned);
}
mContentTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//to do
}
});
}
...
其中,我们也可以定制超链接部分的样式:
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
/**
* @version mochuan.zhb on 2013/3/3.
* @Author Zheng Haibo
* @Company Alibaba Group
* @PersonalWebsite http://github.com/nuptboyzhb
* @Description 去掉下滑线的点击span
*/
public class FollowClickableSpan extends ClickableSpan {// extend ClickableSpan
@Override
public void onClick(View view) {
}
@Override
public void updateDrawState(TextPaint ds) {// override updateDrawState
ds.setUnderlineText(false); // set to false to remove underline
ds.setColor(0xff009ff0);
}
}
同样的思路,我们可以对其他html标签进行解析,然后进行改造;比如:
你还有<font color="#f00">20</font>项代办事情
/**
* 将所有的font前景色标签,进行颜色重置
*
* @param content
* @param colorValue
* @return
*/
private CharSequence parseSpanResetColor(String content, int colorValue) {
try {
Spanned spanned = Html.fromHtml(content);
SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;
ForegroundColorSpan[] spans = spanned.getSpans(0, content.length(), ForegroundColorSpan.class);
if (spans.length > 0) {
for (ForegroundColorSpan foregroundColorSpan : spans) {
int start = spanned.getSpanStart(foregroundColorSpan);
int end = spanned.getSpanEnd(foregroundColorSpan);
int flag = spanned.getSpanFlags(foregroundColorSpan);
spannableStringBuilder.removeSpan(foregroundColorSpan);
spannableStringBuilder.setSpan(new ForegroundColorSpan(colorValue), start, end, flag);
}
}
return spannableStringBuilder;
} catch (Exception e) {
e.printStackTrace();
}
return new SpannableString(content);
}