1. 程式人生 > >HtmlSpanner 使用筆記

HtmlSpanner 使用筆記

  1. HtmlSpanner基於https://github.com/NightWhistler/HtmlSpanner, 主體程式碼基本全部copy,擴充套件了兩點: 
    1. 原始版本在解析Html時使用了HTMLCleaner解析庫,但是在我引入的過程中發現該庫以及其依賴的庫引入了太多的方法,有點得不償失。因此Html解析這部分被我進行了替換。對解析功能進行了抽象介面: 在net.nightwhistler.htmlspanner.parse中,基於SDK內建的javax.xml.parsers和org.w3c.dom進行了解析的實現替換以及XML元素的表示,使得方法數控制在一個相對較小的量級。
    2. 根據專案需求引入了一部分新的html標籤支援,以及新的html標籤屬性支援。
  2. 引入HtmlSpanner的目的是為了提升格式化文字的效率,其對比SDK內建的Html類的有這些優勢: 
    1. 可以支援Html標籤的屬性,Html類雖然也可以,但是支援的很有限,並且不能自定義屬性。同時Html對標籤的支援還有版本相容問題。
    2. 支援新的Html標籤很方便,Html雖然也可以,但是不能成體系化。
    3. 最重要的一點是,這部分程式碼是完全歸屬於專案的,debug以及擴充套件都非常自由,不必受限於Android本身的框架和實現。
  3. HtmlSpanner使用棧來在解析過程中快取Html文字格式解析資訊,在最終解析完以後基於棧先進後出對文字進行格式化(applySpan, 使用棧是為了迎合Html標籤巢狀的規則),詳細過程參考HtmlSpanner的fromHtml函式流程即可。
  4. HtmlSpanner支援的標籤可以參考HtmlSpanner的registerBuiltInHandlers()方法,其列出了所有當前支援的標籤型別。
  5. 要增加對一個新標籤的支援,也可以參考HtmlSpanner的registerBuiltInHandlers()中的實現: 自定義一個TagNodeHandler, 然後使用registerHandler將表簽名和自定義的Handler關聯起來。
  6. 有一個需要注意的事項: Android特有的銷燬-恢復機制在恢復一個SpannableString時,只能支援特定型別的Span: 可以參見TextUtils中的CHAR_SEQUENCE_CREATOR和writeToParcel()方法,這就意味著某些不被支援的Span在經過銷燬-恢復之後就丟失了,導致HtmlSpanner解析出來的SpannableString被破壞了。想要規避這個問題,一個比較hack的方法是禁止控制元件的SavedState功能(比如TextView,這樣其就不會自己進行內容恢復),如果TextView的內容在每次銷燬-恢復之後會被程式碼進行設定(即不會導致動態資訊的丟失),禁止SavedState是可行的。
  7. HtmlSpanner是支援css的,不過沒有需求,沒有進行過運用。

相關推薦

HtmlSpanner 使用筆記

HtmlSpanner基於https://github.com/NightWhistler/HtmlSpanner, 主體程式碼基本全部copy,擴充套件了兩點:  原始版本在解析Html時使用了HTMLCleaner解析庫,但是在我引入的過程中發現該庫以及其依賴的庫引入了太多的方法,有點得不償失。因此Htm

HtmlSpanner擴充套件筆記

HtmlSpanner基於https://github.com/NightWhistler/HtmlSpanner, 主體程式碼基本全部copy,擴充套件了兩點: 原始版本在解析Html時使用了HTMLCleaner解析庫,但是在我引入的過程中發現該庫以及其依賴的庫引入了太多的方法,有點得不償失。因此Ht

Robot Operating System (ROS)學習筆記4---語音控制

sla 語音 出現 tput http 學習 process 輸入 ubun 搭建環境:XMWare Ubuntu14.04 ROS(indigo) 轉載自古月居 轉載連接:http://www.guyuehome.com/260 一、語音識別包 1、安裝

筆記:I/O流-字符集

表示 ava deb 建立 gin integer 示例 字節 標準化 Java 庫的 java.nio 包用 Charset 類統一了對字符集的轉換,支付姐建立了兩個字節Unicode碼元序列與使用本地字符編碼方式的字節序列之間的映

MySQL學習筆記(六)—— MySQL自連接

概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

《代碼閱讀》讀書筆記(一)

需求 的人 一行 編碼 重要 流動 使用 分析 缺少 《代碼閱讀》讀書筆記(一) 《代碼閱讀》(《Code Reading The Open Source Perspective》)Diomidis Spinellis 著 ---------------------

Nginx的安裝(筆記

maximum 字符 erer min sse 最長路 gzip_vary plain bsp 0, 先決條件Nginx 依賴 pcre-devel, openssl, openssl-devel安裝命令:yum -y install pcre-devel openssl

oracle PLSQL程序造數據筆記

blog rst plsql cnblogs varchar2 spa subst type evel 1.造假數據: 1 declare 2 type t_website_id is table of number(10); 3 type t_websit

jquery 深入學習筆記之中的一個 (事件綁定)

color 動態 name his pan mouseover this pre con 【jquery 事件綁定】 1、加入元素事件綁定 (1) 加入事件為當前元素 $(‘p‘).on(‘click‘,function(){ //code here ..

AngularJS入門學習筆記

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

MongoDB權威指南--筆記

這一 article dfs $natural 變慢 tags 復用 lec score mongodb並不具備一些在關系型數據庫中很普遍的功能,如連接和復雜的多行事務。 集合-->文檔-->id id在文檔所屬的集合中是唯一的。 db.help()查看數據庫級

《大型網站技術架構:核心原理與案例分析》-- 讀書筆記 (5) :網購秒殺系統

案例 並發 刷新 隨機 url 對策 -- 技術 動態生成 1. 秒殺活動的技術挑戰及應對策略 1.1 對現有網站業務造成沖擊 秒殺活動具有時間短,並發訪問量大的特點,必然會對現有業務造成沖擊。對策:秒殺系統獨立部署 1.2 高並發下的應用、

筆記:I/O流-對象序列化

err extends 自己 point clas xtend his size cto Java 語言支持一種稱為對象序列化(Object Serialization)的非常通用的機制,可以將任何對象寫入到流中,並在之後將其讀回,首先需要支持對象

Python學習筆記-2017.5.4

列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

SAS學習筆記之函數應用

不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

筆記:mysql 下載與安裝

blog utf8 字符 data strong def services -1 個人 1.下載: 官網下載是需要註冊的,或者你已經有了Oracle的賬號. 可以直接百度 mysql 進入官網;或者直接下面的鏈接; 附上鏈接:dev.mysql.com/downloa

塗抹mysql筆記-搭建mysql高可用體系

argument 並且 ren enum 記錄 ica 操作系統 ner 一份 mysql的高可用體系<>追求更高穩定性的服務體系 可擴展性:橫向擴展(增加節點)、縱向擴展(增加節點的硬件配置) 高可用性<>Slave+LVS+Keepalived實

OpenCV2學習筆記(十五):利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

avalonjs 學習筆記1---checkbox

nod item ack lex server ini npm 學習 define 一、vscode 安裝使用 1.vs code+node.js下載安裝 2.在node.js command prompt 中運行 npm install -g live-server 3

Log4j筆記----01

毫秒 診斷 ets 一個 不存在 末尾 otl 所在 images 新建普通java project 項目創建文件如上 log4j.properties中編輯屬性 ### 設置### log4j.rootLogger = debug,stdout,D,E #