接上一篇,現在ListView已經有了基本外觀,能夠顯示使用者名稱的微博內容了,接下來,我們來把URL和@符號以特殊的外觀顯示出來。
對於URL的顯示,我想大家都知道,就是把TextView的AutoLinkMask屬性進行設定,這樣不僅能把URL展示為連結,還可以正確的識別郵箱地址和電話號碼等連結。
那麼對於“@暱稱”這樣的形式,大家不妨試一下,僅僅通過設定AutoLinkMask是不夠的,是不能被識別出來的。因為這顯示不在它能自動識別的連結的格式之內。
那麼如何處理這個元素呢?
我們可以分兩步來考慮,一是識別這種形態,另一是用特殊的顏色表現出來。
首先是識別,這裡我用最簡單的辦法進行了識別的過程,即找到‘@’符號,再向後在一定範圍內找到‘:’或‘ ’,然後這中間的字元即是識別出來的部分。只是示範,顯然不能涵蓋所有的情況。
然後是表現,如果想在TextView中對部分文字使用特別的顏色,最便捷的方式就是使用HTML元素,即通過為其添加<Font>標籤來影響Android的渲染。
這兩步都有瞭解決思路,開始編碼吧。
從TextView繼承一個子類BlogTextView,改寫其中的setText()方法,對設定進來的文本進行儲存,然後識別出其中的“@暱稱”形式,識別好以後為其加入<Font>標籤,再利用基類的SetText()方法進行處理,當然,也不能忘了為其開啟AutoLinkMask,還有改寫getText()方法,返回類中儲存的原始文本資訊。代碼如下:
package com.wenbin.test;</p><p>import java.util.Map;<br />import java.util.Set;</p><p>import android.content.Context;<br />import android.graphics.drawable.Drawable;<br />import android.text.Html;<br />import android.text.Html.ImageGetter;<br />import android.text.util.Linkify;<br />import android.util.AttributeSet;<br />import android.widget.TextView;</p><p>public class BlogTextView extends TextView {<br />private static final int NAMELENGTH=15; //假設暱稱不超過15個字元<br />private CharSequence text;</p><p>public BlogTextView(Context context) {<br />super(context);<br />setAutoLinkMask(Linkify.ALL);<br />}</p><p>public BlogTextView(Context context, AttributeSet attrs) {<br />super(context, attrs);<br />setAutoLinkMask(Linkify.ALL);<br />}</p><p>public BlogTextView(Context context, AttributeSet attrs, int defStyle) {<br />super(context, attrs, defStyle);<br />setAutoLinkMask(Linkify.ALL);<br />}</p><p>@Override<br />public CharSequence getText() {<br />return text==null?"":text;<br />}</p><p>@Override<br />public void setText(CharSequence text, BufferType type) {<br />this.text=text;</p><p>String cs=text.toString();<br />String font1="<font color=#339966>";<br />String font2="</font>";</p><p>//找以'@'開頭以':'或' '結尾的子串,將其使用font標記進行修飾<br />int start=0;<br />while(true){<br />start=cs.indexOf('@',start);<br />if (start<cs.length() && start>=0){<br />int end=cs.indexOf(' ',start);<br />if (end<cs.length() && end>0 && end-start<=NAMELENGTH){<br />CharSequence subcs=new String(cs.subSequence(start, end).toString());<br />cs=cs.replace(subcs,font1+subcs+font2 );<br />start+=font1.length()+subcs.length()+font2.length();<br />}<br />else{<br />end=cs.indexOf(':',start);<br />if (end<cs.length() && end>0 && end-start<=NAMELENGTH){<br />CharSequence subcs=new String(cs.subSequence(start, end).toString());<br />cs=cs.replace(subcs,font1+subcs+font2 );<br />start+=font1.length()+subcs.length()+font2.length();<br />}<br />}<br />start+=1;<br />}<br />else{<br />break;<br />}<br />}</p><p>super.setText(Html.fromHtml(cs), type);<br />}<br />}<br />
寫完以後,把資源檔blogview.xml中id為blogText和reBlogText的TextView改為com.wenbin.test.BlogTextView,這是使用自訂控制項的方法。代碼片斷如下:
<com.wenbin.test.BlogTextView android:id="@+id/blogText" android:layout_height="wrap_content"<br /> android:layout_below="@+id/userName"<br /> android:textColor="@color/black"<br /> android:textSize="15sp" android:layout_width="wrap_content"><br /> </com.wenbin.test.BlogTextView>
運行程式,效果如所示:
——歡迎轉載,請註明出處 http://blog.csdn.net/caowenbin ——