前言:
此时咱们对“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标签