使用多種布局布局,每種對應壹種HTML格式,比如圖片,比如有序列表等。具體實現例子可以參考這個鏈接。中等和
Evernote的富文本編輯就是這樣實現的。總的來說比較復雜。
WebView+JavaScript實現。現在Web上有很多成熟的JavaScript富文本編輯庫,比如Squire。妳只需要做好它。
WebView和JavaScript的交互就夠了(多寫點回調函數)。雖然理論上是這樣,但是在實現過程中妳需要解決WebView的兼容性問題(
Android 4.4及以上不同於4.4以下的WebView內核),以及其他不可預見的問題(比如無法粘貼文本的問題)。
編輯文本+ Span .Android的TextView原生支持粗體、刪除線、引用等Span。
,實現簡單的富文本編輯需求,可操作性還是比較大的。綜合考慮之後,我選擇了這種方式來實現自己的需求。
既然決定用EditText+Span來實現,就要對相關的API有所了解。
首先,我們來了解壹下Span。Span是壹個很強大的概念,有興趣深造的同學推薦直接看這個翻譯。
這裏使用了兩種主要類型的跨度:
繼承自CharacterStyle的Span,如StyleSpan,可以在字符級添加粗體、下劃線等。
從ParagraphStyle繼承的Span,如QuoteSpan,可以添加對段落級文本的引用。
然後我們需要壹個可以把Span的效果設置進去的文本結構(也就是實現了Spannable接口),SpannableStringBuilder。
是個不錯的選擇,EditText提供的getEditableText()方法也可用。通常只需要getEditableText()
就這麽做吧,但是面對壹些細節,可以用SpannableStringBuilder預置相應的跨度,然後用原文替換。
設置Span的方式也很簡單,妳需要調用spanable。setspan (object what,int start,int end,int。
Flags)這個方法就夠了,方法中的四個參數解釋如下:
對象什麽,傳入妳用的Span對象。
Int start,設置跨度的起始位置。
Int end,設置跨度的結束位置。
Int flags,表示設置Span的範圍。
在這裏,我將重點關註參數int標誌,它接受四種類型的參數,即:
跨越。Span _ inclusive _ exclusive是指在設置Span區域之前輸入文本,輸入的文本也會受到Span的影響。
的影響。
跨越。Span _ inclusive _ inclusive是指在設置Span的區域前後輸入文本,所有輸入的文本都服從Span。
的影響。
跨越。Span _ exclusive _ exclusive,這意味著只有當妳在設置了Span的區域鍵入輸入文本時,輸入文本才會服從Span。
的影響。
跨越。Span _ exclusive _ inclusive是指設置Span區域後輸入文本,輸入的文本也會受到Span的影響。
的影響。
“受影響”表示您仍將保持您設置的Span的樣式,如選擇spanned。span _ exclusive _ inclusive。
如果壹段文本被設置為粗體,那麽該段之後新輸入的文本也將是粗體。此處推薦span _ exclusive _ exclusive。
參數,畢竟其他參數相對難以控制,會給用戶帶來困惑。人們認為,操作代表的行為應該準確無誤。
好了,這裏我們已經知道如何制作壹個富文本編輯器組件,無非就是指定起始位置和結束位置,然後設置相應的跨度。
去做吧。至於設置時采用什麽規則,可以自己定制。但只是解決了編輯的問題,還有導入導出的問題。
進口的問題很簡單。Android SDK中提供了Html.fromHtml()的方法,可以很容易地將Html字符串轉換成需要的字符串。
跨區對象。但是需要註意的是,Html.fromHtml()並不支持所有的Html標簽,比如無序列表,所以需要自己實現。
Html。TagHandler接口處理妳需要的標簽,可以參考這個鏈接實現對刪除線和簡單無序列表的支持。
面對粗體、斜體等字符級樣式,Html.fromHtml()
自然會解決,該加的地方加換行符,沒問題;但面對引用、無序列表等段落級樣式,這種方法會增加壹個換行符,即兩個換行符,相當於多了壹個空行。壹般來說,人們認為壹個人
對應兩個
但是如果妳有特殊需求,也可以像上面說的那樣自己分析,不要用默認的系統。
之前介紹過如何導入,妳壹定很清楚,壹定有對應的Html.toHtml()方法!是的,但不幸的是,這種方法不支持所有跨度。
例如,不支持列表。不過沒關系,Html.toHtml()的源代碼本身簡單易懂,可以借鑒。
這裏重點介紹Spannanle的壹個接口方法nextspantransfontrol(int start,int limit,class)。
Type),此方法將返回您在指定的文本範圍內指定的下壹個跨度類型的起始位置。按照這種方法,可以逐層掃描指定的跨度。
不用同時考慮其他類型跨度的影響,非常有用。
最後,盡管如此,導入導出還有壹個關鍵問題,就是導入的內容要和導出的內容壹致。目前我很難做到這壹點。我只能說應該盡量控制,必要的話需要用正則化來處理導入導出的文本。