TextView的html内容显示开发者可能不陌生,但是想控制里面的字体大小,好像就不是这么简单了。那是怎么回事呢,请往下看!
哈哈,这么简单的代码对于我们来说不就是分分钟就搞定吗,马上就来验证一下自己的成果
到了这个时候我们只能够自己去定义实现font以及获取里面的属性了,要怎么做呢,我们可以看到其实他在这一大堆if else的判断里面已经把font这个标签给处理掉了,不会给我们继续处理(不要跟我说修改源码),这时候其实我们看一下if else的最后,他是会进行回调到一个叫TagHandler里面的方法的,那么我们只需要去实现这个接口就可以了,从上面可以看出来,他是一个抽象类,用于给我们扩展的。
上面说到了font标签已经被处理掉了,不会再回调给我们,所以我们就需要自己去定义一个标签,当然了,后端给予我们得一样可以是font的,我们只是自己去进行替换,类似这样子
首先是替换成一个源码里不会进行处理的标签
使用startIndex和stopIndex来进行判断每一个标签头和尾的位置,对里面的文本进行相对应的样式处理。然后让我们来运行一下代码试试
那么修复了这个小bug后让我们来看看我们的最终成功,一个字段显示多种不同样式的文本
1 2 3 | String htmlStr = "<font color= '#0000FF' size= '50px' >我是蓝色的文本</font> <font color= '#ff0000' size= '40px' >我是红色的文本</font> <font color= '#000000' size= '29px' >我是黑色的文本</font>"; |
哈哈,这么简单的代码对于我们来说不就是分分钟就搞定吗,马上就来验证一下自己的成果
到了这个时候我们只能够自己去定义实现font以及获取里面的属性了,要怎么做呢,我们可以看到其实他在这一大堆if else的判断里面已经把font这个标签给处理掉了,不会给我们继续处理
上面说到了font标签已经被处理掉了,不会再回调给我们,所以我们就需要自己去定义一个标签,当然了,后端给予我们得一样可以是font的,我们只是自己去进行替换,类似这样子
1 2 | htmlStr = htmlStr.replaceAll( "font" , "bluefont" ); mTextView.setText(Html.fromHtml(htmlStr, null, new HtmlTagHandler())); |
首先是替换成一个源码里不会进行处理的标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /** * Created by blue. */ public class HtmlTagHandler implements Html.TagHandler { private static final String TAG_BLUE_FONT = "bluefont" ; private int startIndex = 0; private int stopIndex = 0; final HashMap<String, String> attributes = new HashMap<String, String>(); @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { processAttributes(xmlReader); if (tag.equalsIgnoreCase(TAG_BLUE_FONT)){ if (opening){ startFont(tag, output, xmlReader); } else { endFont(tag, output, xmlReader); } } } public void startFont(String tag, Editable output, XMLReader xmlReader) { startIndex = output.length(); } public void endFont(String tag, Editable output, XMLReader xmlReader){ stopIndex = output.length(); String color = attributes.get( "color" ); String size = attributes.get( "size" ); size = size.split( "px" )[0]; if (!TextUtils.isEmpty(color) && !TextUtils.isEmpty(size)){ output.setSpan( new ForegroundColorSpan(Color.parseColor(color)), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (!TextUtils.isEmpty(size)){ output.setSpan( new AbsoluteSizeSpan(Integer.parseInt(size)), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } private void processAttributes(final XMLReader xmlReader) { 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++){ attributes.put(data[i * 5 + 1], data[i * 5 + 4]); } } catch (Exception e) { } } } |
使用startIndex和stopIndex来进行判断每一个标签头和尾的位置,对里面的文本进行相对应的样式处理。然后让我们来运行一下代码试试
<p>
标签等等 2)发送html格式的字符串过来的时候将<html><body>
也就是一整个网页需要的信息传递过来,也可以解决这个问题那么修复了这个小bug后让我们来看看我们的最终成功,一个字段显示多种不同样式的文本
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2302
- 用户1336
- 访客10979821
每日一句
If you want to achieve greatness, stop asking for permission.
如果你想获得伟大,别再请求许可。
如果你想获得伟大,别再请求许可。
排名前5的开源在线机器学习
Android自定义蜂窝view
Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手
Java中的(耦合)控制反转
OpenGL读取帧缓存数据
首发:Thinkpad T550黑苹果10.13.4安装教程
反编译修改class文件变量
IntelliJ IDEA2018~2019.1激活码-注册码
p2p通信,打洞技术,穿越NAT的实现(附NAT环境检测工具)
【黑苹果安装】——如何在windows下操作EFI分区
Could not resolve io.flutter 解决方法
MPAndroidChart标记控件MarkerView的使用方法
imencode和imdecode使用
新会员