龙空技术网

TextView使用Html.froml时span标签无效

我本人的 266

前言:

此时咱们对“cssimport没用”大概比较注意,朋友们都想要知道一些“cssimport没用”的相关文章。那么小编也在网摘上搜集了一些关于“cssimport没用””的相关知识,希望我们能喜欢,姐妹们快快来了解一下吧!

在低版本安卓中对TextView加载html所支持的标签不够多,比如在搭载了android 5.1的手机上我们的app调用了Html.froml为TextView设置文本时,当source包含span标签时不会处理,高版本则会去处理;

对比下高低版本的Html.java如下:

android api level 22

android api level 28

我们发现,高版本是支持span标签的,那低版本怎么处理呢?我们看到方法handleStartTag

中在不支持的标签都会回调一个方法:

所以我们只需要传入自定义的TagHandler就可以处理Html.java不支持的标签了。

一开始我们为TextView设置文本时这样写:

String text="创建<span style='color: #ff8500;'>7</span>天,累计消费<span style='color: #ff8500;'>15</span>元";textview.setText(Html.fromHtml(text));

高版本手机正常加载span标签,低版本的手机效果如下:

更改后这样写:

String text="创建<span style='color: #ff8500;'>7</span>天,累计消费<span style='color: #ff8500;'>15</span>元";textview.setText(Html.fromHtml(text,null,new CustomTagHandler()));

更改后在低版本效果如下:

CustomTagHandler的实现参考高版本的Html.java,完整代码如下:

import android.graphics.Color;import android.text.Editable;import android.text.Html;import android.text.Spannable;import android.text.TextUtils;import android.text.style.BackgroundColorSpan;import android.text.style.ForegroundColorSpan;import android.text.style.StrikethroughSpan;import org.xml.sax.XMLReader;import java.lang.reflect.Field;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 作者:lpx on 2021/12/1 17:33 * Email : 1966353889@qq.com * Describe:自定义TagHandler */public class CustomTagHandler implements Html.TagHandler {    private static Pattern sForegroundColorPattern;    private static Pattern sBackgroundColorPattern;    private static Pattern sTextDecorationPattern;    /**     * 目标Span开始的位置     */    private int startIndex;    /**     * 前景色     */    private int foregroundColor;    /**     * 背景色     */    private int backgroundColor;    /**     * 删除线     */    private boolean lineThrough;    @Override    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {        if (tag.equalsIgnoreCase("span")) {            if (opening) {                //标签开始                startIndex = output.length();                foregroundColor = backgroundColor = -1;                lineThrough = false;                String style = getProperty(xmlReader, "style");                if (!TextUtils.isEmpty(style)) {                    Matcher m = getForegroundColorPattern().matcher(style);                    if (m.find()) {                        foregroundColor = getColor(m.group(1));                    }                    m = getBackgroundColorPattern().matcher(style);                    if (m.find()) {                        backgroundColor = getColor(m.group(1));                    }                    m = getTextDecorationPattern().matcher(style);                    if (m.find()) {                        String textDecoration = m.group(1);                        if (textDecoration.equalsIgnoreCase("line-through")) {                            lineThrough = true;                        }                    }                }            } else {                //标签结束                int endIndex = output.length();                if (foregroundColor != -1) {                    output.setSpan(new ForegroundColorSpan(foregroundColor), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);                }                if (backgroundColor != -1) {                    output.setSpan(new BackgroundColorSpan(backgroundColor), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);                }                if (lineThrough) {                    output.setSpan(new StrikethroughSpan(), startIndex, endIndex, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);                }            }        }    }    private int getColor(String color) {        try {            return Color.parseColor(color);        } catch (Exception e) {            e.printStackTrace();        }        return -1;    }    /**     * 利用反射获取html标签的属性值     */    private String getProperty(XMLReader xmlReader, String property) {        try {            Field elementField = xmlReader.getClass().getDeclaredField("theNewElement");            elementField.setAccessible(true);            Object element = elementField.get(xmlReader);            Field attsField = element.getClass().getDeclaredField("theAtts");            attsField.setAccessible(true);            Object atts = attsField.get(element);            Field dataField = atts.getClass().getDeclaredField("data");            dataField.setAccessible(true);            String[] data = (String[]) dataField.get(atts);            Field lengthField = atts.getClass().getDeclaredField("length");            lengthField.setAccessible(true);            int len = (Integer) lengthField.get(atts);            for (int i = 0; i < len; i++) {                //判断属性名                if (property.equals(data[i * 5 + 1])) {                    return data[i * 5 + 4];                }            }        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    private static Pattern getForegroundColorPattern() {        if (sForegroundColorPattern == null) {            sForegroundColorPattern = Pattern.compile(                    "(?:\\s+|\\A)color\\s*:\\s*(\\S*)\\b");        }        return sForegroundColorPattern;    }    private static Pattern getBackgroundColorPattern() {        if (sBackgroundColorPattern == null) {            sBackgroundColorPattern = Pattern.compile(                    "(?:\\s+|\\A)background(?:-color)?\\s*:\\s*(\\S*)\\b");        }        return sBackgroundColorPattern;    }    private static Pattern getTextDecorationPattern() {        if (sTextDecorationPattern == null) {            sTextDecorationPattern = Pattern.compile(                    "(?:\\s+|\\A)text-decoration\\s*:\\s*(\\S*)\\b");        }        return sTextDecorationPattern;    }}

标签: #cssimport没用 #java去掉html标签