Hacks控件篇-Hack2 格式化TextView的文本

格式化TextView的文本

作者:李旺成

時(shí)間:2016年5月14日


這個(gè) Hack 將介紹關(guān)于 TextView 格式化的相關(guān)知識(shí)。

特殊樣式文本

先來看看微博中一段文本包含不同樣式的示例:

微博示例

在網(wǎng)頁上要實(shí)現(xiàn)類似上面的效果會(huì)比較簡(jiǎn)單:

網(wǎng)頁微博示例

網(wǎng)頁源碼:

<div class="WB_text W_f14" node-type="feed_list_content">
<a target="_blank" render="ext" suda-uatrack="key=topic_click&value=click_topic" class="a_topic" extra-data="type=topic" >#奇葩說#</a> 
面對(duì)辯題
<a target="_blank" render="ext" suda-uatrack="key=topic_click&value=click_topic" class="a_topic" extra-data="type=topic" >#愛上人工智能算不算愛情#</a> 
大美玲
<a target="_blank" render="ext" extra-data="type=atname"  usercard="name=Daghe">@Daghe</a> 
說完自己的觀點(diǎn)之后,給我們講了一個(gè)自己的故事宴合。當(dāng)思達(dá)站在路上像一個(gè)笨蛋一樣,呆呆的回頭看的時(shí)候,那種等不到的失落感充滿整個(gè)心的時(shí)候,大概這就是愛吧余爆。我不明白那個(gè)人為什么遲遲不出現(xiàn),我想
<a target="_blank" render="ext" suda-uatrack="key=topic_click&value=click_topic" class="a_topic" extra-data="type=topic" >#幫姜思達(dá)找到他#</a>夸盟。
<a suda-uatrack="key=tblog_card&value=click_title:3974797250061553:1034-video:1034%3A0a3f8741d4d5d557a14ea26facccedd2:page_102803_home:5512188486:3974797250061553:5512188486" title="秒拍視頻"  action-type="feed_list_url" target="_blank"><i class="W_ficon ficon_cd_video">L</i>秒拍視頻</a>
</div>

那在 Android 中要實(shí)現(xiàn)上述效果該如何做蛾方?

使用 TextView 展示多樣式文本

一般在類微博、QQ空間這類社交 App 中使用這類多樣式文本的地方比較常見。要實(shí)現(xiàn)這些效果并不需要什么自定義控件转捕,因?yàn)?Android 里面的 TextView 已經(jīng)足以勝任作岖。(話說 TextView 一個(gè)非常常用的控件,但是可能你并不知道它所“蘊(yùn)含的能量”五芝,它的強(qiáng)大可能讓人驚訝...)

示例:

使用 TextView 展示多樣式文本

使用 Html 實(shí)現(xiàn)

先介紹一種直觀或者說使用比較簡(jiǎn)單的方法來實(shí)現(xiàn):

mTestTV1 = (TextView) findViewById(R.id.tv_test1);

String htmlText = "<a href=\"http://diy-green.github.io/\">我是鏈接</a>哈哈<font color='#ff0000'>@XXX<font>";
mTestTV1.setText(Html.fromHtml(htmlText));

很簡(jiǎn)單痘儡,兩行代碼或者一行代碼就搞定了,是的沒錯(cuò)就是用了兩個(gè) Html 標(biāo)簽(注意:TextView 只支持部分的 Html 標(biāo)簽枢步,不要當(dāng) WebView 用)沉删。

也就是說,只需兩步:

  1. 使用 Html 標(biāo)簽包裹目標(biāo)文本
  2. 將 Html.fromHtml() 方法處理過的文本賦值給 TextView

那 Html.fromHtml() 方法到底做了什么工作醉途?這里不打算介紹該方法的源碼實(shí)現(xiàn)矾瑰,我們更關(guān)心的是該方法處理后返回的對(duì)象。

public static Spanned fromHtml(String source);

Spanned 是什么隘擎?這是個(gè)接口:

public interface Spanned extends CharSequence {}

那就可以解釋為什么能夠直接將 Spanned 賦值給 TextView 的 setText(CharSequence text) 方法了殴穴。

來看下 Spanned 的繼承結(jié)構(gòu),找找它的子類什么的:

Spanned 的繼承結(jié)構(gòu)

通過繼承結(jié)構(gòu)货葬,我們知道了該接口的實(shí)現(xiàn)類采幌,那么我們直接使用它的實(shí)現(xiàn)類即可。

SpannableString 實(shí)現(xiàn)

上面介紹的使用 Html 標(biāo)簽實(shí)現(xiàn)方式雖然直觀震桶,而且使用簡(jiǎn)便休傍,但是有如下不足:

  • 功能局限性:并不支持所有的 Html 標(biāo)簽,有些效果不能實(shí)現(xiàn)
  • 性能損耗:由于使用的是 Html 標(biāo)簽蹲姐,那么不可避免需要解析這些標(biāo)簽磨取,這是有性能損耗的

看代碼吧:

mTestTV2 = (TextView) findViewById(R.id.tv_test2);

Spannable spannableString = new SpannableString("我是不同顏色的文本,哈哈柴墩,不同顏色文本");
spannableString.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);
spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 9, 0);
mTestTV2.setText(spannableString);

這種方式稍顯麻煩忙厌,但也還好,主要是如下兩步:

  1. 創(chuàng)建 SpannableString 對(duì)象
  2. 為不同的文本段設(shè)置不同的 “Span”

上面兩種方式的本質(zhì)是一樣的拐邪,都需要生成 Spanned 對(duì)象慰毅,只是生成的方式的差別而已。

這里就不展開對(duì) Spanned 進(jìn)行介紹扎阶,這個(gè)將會(huì)在 AndroidStudyDemo 系列AndroidStudyDemo 分類 中寫一篇詳解。

小結(jié)

TextView 使用簡(jiǎn)單婶芭,但是功能非常強(qiáng)大东臀。上面介紹的兩種格式化文本的方式,可以根據(jù)實(shí)際需要選擇犀农。

項(xiàng)目地址

AndroidHacks合集
控件使用篇

項(xiàng)目示例代碼:
FormatTextActivity.java
activity_format_text.xml

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惰赋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赁濒,老刑警劉巖轨奄,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拒炎,居然都是意外死亡挪拟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門击你,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玉组,“玉大人,你說我怎么就攤上這事丁侄」喏ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鸿摇,是天一觀的道長石景。 經(jīng)常有香客問我,道長拙吉,這世上最難降的妖魔是什么潮孽? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮庐镐,結(jié)果婚禮上恩商,老公的妹妹穿的比我還像新娘。我一直安慰自己必逆,他們只是感情好怠堪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著名眉,像睡著了一般粟矿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损拢,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天陌粹,我揣著相機(jī)與錄音,去河邊找鬼福压。 笑死掏秩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荆姆。 我是一名探鬼主播蒙幻,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胆筒!你這毒婦竟也來了邮破?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抒和,沒想到半個(gè)月后矫渔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摧莽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年庙洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范嘱。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡送膳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丑蛤,到底是詐尸還是另有隱情叠聋,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布受裹,位于F島的核電站碌补,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棉饶。R本人自食惡果不足惜厦章,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望照藻。 院中可真熱鬧袜啃,春花似錦、人聲如沸幸缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽发乔。三九已至熟妓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栏尚,已是汗流浹背起愈。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留译仗,地道東北人抬虽。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像纵菌,于是被迫代替她去往敵國和親斥赋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,766評(píng)論 22 665
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程产艾,因...
    小菜c閱讀 6,424評(píng)論 0 17
  • 這幾天比較浮躁,上班時(shí)插科打諢,下了班看劇逛街闷堡。今天是星期五隘膘,周末要來了,心情自然不差杠览。晚飯后跑跑步弯菊,借此令自己平...
    趨近理想閱讀 215評(píng)論 0 0
  • 男人,或醉行途中踱阿,或醉于夢(mèng)想管钳!
    蓮東燉罐阿東閱讀 172評(píng)論 0 0
  • 2逃離醫(yī)院 2016年7月11日,醫(yī)院的診斷書上明明白白寫著:侵潤性乳腺癌一期。 擺在我面前的,有兩條路: 一,繼...
    雪莉詩話閱讀 646評(píng)論 15 18