您的位置:首页 > 移动开发 > Android开发

Android:借用html标签协议,定义自己的协议

2017-07-02 22:27 537 查看

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android