如何利用 HtmlSpanner解析 HTML格式 的字符串:

1. GitHub 下载HtmlSpanner项目 https://github.com/NightWhistler/HtmlSpanner

2. 最好是直接放在java目录下在,这样不需要改引用的包路径

3.  引入需要的依赖包

  1. implementation 'net.sourceforge.htmlcleaner:htmlcleaner:2.21'
  2. implementation 'com.osbcp:cssparser:1.7'

  4. 使用方法:

  1. // 页面上用于展示 html格式的文本布局
  2. TextView textView = findViewById(R.id.htmlSpanner);
  3. // 直接 new一个 HtmlSpanner对象
  4. HtmlSpanner htmlSpanner = new HtmlSpanner(); // 格式化
  5. // 解析 html得到 spannable对象
  6. Spannable spannable1 = htmlSpanner.fromHtml("<span style='color:red'>html格式的文字1</span>");
  7. // 显示到 TextView上
  8. textView.setText(spannable1);

 5. 在使用中遇到的问题——当富文本中颜色格式是rgb格式,解析失败

解决思路:

  1. 首先我们解析的是style='color:rgb(0,255,255)' 这种格式,于是看源码觉得 CSSCompiler 这个类很有问题

  2. 找与颜色相关的于是就找到了 parseCSSColor( String colorString ) 这个方法,看起来就是转换颜色用的

  3. 源码的写法如下:(是没有对于rgb格式的算法,所以不能解析就很合理啦)

  

  4. 想法修改:( 遇到 0rgb格式就先处理成我们的 hex格式,这样不就完美了嘛 )

  5. 工具类代码如下:

  1. package com.xxx.xxx.xxx;
  2.  
  3. public class ColorUtil {
  4.  
  5. /**
  6. * rgb 格式的颜色转 hex格式颜色
  7. * @param rgb
  8. * @return
  9. */
  10. public static String rgb2hex(String rgb) {
  11. int r = 0;
  12. int g = 0;
  13. int b = 0;
  14. int left = rgb.indexOf("(");
  15. int right = rgb.indexOf(")");
  16. if (left > -1 && right > -1 && right > left) {
  17. String substring = rgb.substring(left + 1, right);
  18. String[] split = substring.split(",");
  19. if (split.length == 3){
  20. r = Integer.valueOf(split[0].trim());
  21. g = Integer.valueOf(split[1].trim());
  22. b = Integer.valueOf(split[2].trim());
  23. }
  24. }
  25. String rFString, rSString, gFString, gSString,
  26. bFString, bSString, result;
  27. int red, green, blue;
  28. int rred, rgreen, rblue;
  29. red = r / 16;
  30. rred = r % 16;
  31. if (red == 10) rFString = "A";
  32. else if (red == 11) rFString = "B";
  33. else if (red == 12) rFString = "C";
  34. else if (red == 13) rFString = "D";
  35. else if (red == 14) rFString = "E";
  36. else if (red == 15) rFString = "F";
  37. else rFString = String.valueOf(red);
  38.  
  39. if (rred == 10) rSString = "A";
  40. else if (rred == 11) rSString = "B";
  41. else if (rred == 12) rSString = "C";
  42. else if (rred == 13) rSString = "D";
  43. else if (rred == 14) rSString = "E";
  44. else if (rred == 15) rSString = "F";
  45. else rSString = String.valueOf(rred);
  46.  
  47. rFString = rFString + rSString;
  48.  
  49. green = g / 16;
  50. rgreen = g % 16;
  51.  
  52. if (green == 10) gFString = "A";
  53. else if (green == 11) gFString = "B";
  54. else if (green == 12) gFString = "C";
  55. else if (green == 13) gFString = "D";
  56. else if (green == 14) gFString = "E";
  57. else if (green == 15) gFString = "F";
  58. else gFString = String.valueOf(green);
  59.  
  60. if (rgreen == 10) gSString = "A";
  61. else if (rgreen == 11) gSString = "B";
  62. else if (rgreen == 12) gSString = "C";
  63. else if (rgreen == 13) gSString = "D";
  64. else if (rgreen == 14) gSString = "E";
  65. else if (rgreen == 15) gSString = "F";
  66. else gSString = String.valueOf(rgreen);
  67.  
  68. gFString = gFString + gSString;
  69.  
  70. blue = b / 16;
  71. rblue = b % 16;
  72.  
  73. if (blue == 10) bFString = "A";
  74. else if (blue == 11) bFString = "B";
  75. else if (blue == 12) bFString = "C";
  76. else if (blue == 13) bFString = "D";
  77. else if (blue == 14) bFString = "E";
  78. else if (blue == 15) bFString = "F";
  79. else bFString = String.valueOf(blue);
  80.  
  81. if (rblue == 10) bSString = "A";
  82. else if (rblue == 11) bSString = "B";
  83. else if (rblue == 12) bSString = "C";
  84. else if (rblue == 13) bSString = "D";
  85. else if (rblue == 14) bSString = "E";
  86. else if (rblue == 15) bSString = "F";
  87. else bSString = String.valueOf(rblue);
  88. bFString = bFString + bSString;
  89. result = "#" + rFString + gFString + bFString;
  90. return result;
  91. }
  92. }

HtmlSpanner 使用小结 -- 安卓解析html的更多相关文章

  1. 安卓解析JSON文件

    安卓解析JSON文件 根据JOSN文件的格式,文件只有两种数据,一是对象数据,以 {}为分隔,二是数组,以[]分隔 以下介绍安卓如何解析一个JSON文件,该文件存放在assets目录下,即:asset ...

  2. 安卓解析XML文件

    安卓解析XML文件 主要有三种方式:DOM解析.SAX解析.PULL解析 其中: DOM解析为等XMl文件全部加载后,然后根据需要解析的内容解析出所需的内容数据. SAX解析为从XML文件中执行一行, ...

  3. 安卓解析 json 4种格式 全解析

    总共4种json  ,    还提供了 httclient  和 httpurlconnection 2种方式获取json的方法(请把baseurl 改为可以地址比如http://www.sohu.c ...

  4. 安卓解析json,使用BaseAdapter添加至ListView中,中间存储用JavaBean来实现

    这是一个小练习,要求解析一个提供的json文件.并将其中的id,title值获取,以ListView形式展示出来.(开发工具是android studio) 下面开始: 首先我想到的是先把json文件 ...

  5. 安卓解析json

    重点是开启网络权限 难点是调用函数 开启网络权限 </application> <uses-permission android:name="android.permiss ...

  6. 解析Xcode把应用程序打包成ipa---解决打包完新版本itunes提示不是有效应用程序的问题

    Xcode把应用程序打包成ipa是本文要介绍的内容,不多说,先俩看内容.注意:本方法需要先制作假凭证编译于项目中,否则产生的ipa还是无法于iPhone中运行. 制作方法请参考: http://blo ...

  7. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

  8. Java解析YAML和Android解析YAML

    一.Java解析YAML 1. API的选择 一般分两种:Jyaml和snakeYAML.(Jyaml下载地址:http://download.csdn.net/detail/dgssfgfs/847 ...

  9. https 对 json空对象解析的影响

    2017年11月24日09:56:01 记录一个问题: PHP返回json给APP(安卓, fastjson) 其中一个值是空对象  json_encode( [ 'aaa' => new st ...

随机推荐

  1. Java的数组的作业11月06日

    动手动脑 实验一:了解for循环得到棋盘结构 (1) 程序: import java.io.*; public class QiPan { //定义一个二维数组来充当棋盘 private String ...

  2. Python小游戏——猜数字教程(random库教程)

    今天来开发一个简单的数字逻辑游戏,猜数字(数字炸弹) 首先开发游戏第一件事,了解需求. 猜数字游戏规则: 计算机随机生成一个指定范围的数字,由玩家来猜测, 之后计算机会根据玩家提供数字来与自己生成的数 ...

  3. HeidiSQL、Navicat、mysql命令和source命令导入sql脚本的速度比较

    一.四种导入方式的比较 1.heidisql客户端是一条一条插入的,速度最慢,而且很脆弱比较容易崩溃: 2.mysql命令导入380万记录用时1小时13分(属于前台运行的命令,ctrl+c就可以结束) ...

  4. mysql启动错误1067进程意外终止的解决方法

    一.环境介绍 1.mysql主从复制中的从服务器 2.Windows Server 2008 R2 Enterprise系统 64位操作系统 3.MySQL数据库版本为5.6.34 二.报错详情 从服 ...

  5. 利用window10的Linux子系统实现docker的安装使用

    先参照 此博客 点这里 我在执行 apt installdocker.io 命令时,不能正确的安装 docker client 所以我找了下面的命令,然后执行 docker version 成功了 辅 ...

  6. 部署在本服务器上,Jenkins无法启动Tomcat

    今天在部署Jenkins的过程中,有一个需要部署在本服务器上的Web服务,而且Jenkins给我的反馈也是成功的部署了,且Tomcat启动起来了,但是实际打开项目发现其实并没有启动起来 在查看日志的时 ...

  7. opencv实践::对象提取与测量

    问题描述 照片是来自太空望远镜的星云图像,科学家想知道它的面 积与周长. 解决思路 方法一: 通过二值分割+图像形态学+轮廓提取 #include <opencv2/opencv.hpp> ...

  8. 11.Nginx架构进阶

    1.如何将LNMP拆分为LNP+MySQL 1.备份172.16.1.7上的数据库信息 [root@web01 ~]# mysqldump -uroot -p'000000' --all-databa ...

  9. oracle计算两个时间的差值(XX天XX时XX分XX秒)

    在工作中需要计算两个时间的差值,结束时间 - 开始时间,又不想在js里写function,也不想在java里去计算,干脆就在数据库做了一个函数来计算两个时间的差值.格式为XX天XX时XX分XX秒: 上 ...

  10. ThreadPoolExecutor源码中的适配器模式

    什么是适配器模式 网上已有很多的教程,不细讲了.可以参考:五分钟了解设计模式(3)---适配器模式 在适配器模式中,一定要识别清楚,Target Adaptee Adapter分别是哪些类或接口,这样 ...