TextView在Android中實現文字說明等功能,基本的使用都很簡單,那么除了基本展示文字的使用,我們還能夠經常使用TextView實現如下的功能:
1.顯示豐富的文本(URL、字體大小、顏色等)
TextView中預定了一些類似Html的標簽,通過標簽可以使TextView顯示不同的顏色、大小、字體的文字。
- <font> : 設置顏色和字體
- <big>: 設置大號
- <small>: 設置小號
- <i><b>: 斜體、粗體
- <a>: 鏈接地址
- <img>: 插入圖片
使用這些標簽可以使用Html.fromHtml方法。
2.將文本中的URL地址、郵箱地址、電話產生超鏈接的效果
使用android:autoLink來設置,首先在的layout文件夾里面TextView控件增加
android:autoLink="all"
然后在Java中進行設置:
textview.setMovementMethod(LinkMovementMethod.getInstance());
這樣展示出現的內容就可以出現超鏈接的效果。例如,在TextView點擊網址鏈接后,就可以調轉到瀏覽器並打開響應的鏈接。內容可以是Html格式的內容,也可以是String格式的,在使用Html顯示超鏈接的時候,必須保證添加上協議好,例如:http://。否則在識別網址的時候,不加的話,可能會判斷為Activity,然后導致崩潰。使用String格式的內容,在TextView添加setAutoLinkMask(Linkify.ALL)設置之后,可以不加協議識別出來鏈接,但是推薦還是加上。而這兩種方法,都得設置一下setMovementMethod,才會跳轉。
3.TextView顯示表情圖像和文字
如果需要在TextView里面展示res資源里面的圖片的話,可以通過編寫html內容,並通過Html.fromHtml方法來將內容轉換為CharSequence來顯示。
顯示的核心代碼:
String html = "圖像1<image='image1'>"; // 其中image1就是圖片在drawable的name Html.fromHtml(html, new ImageGetter() { @Overrride public Drawable getDrawable(String source) { Drawable drawable = getResource.getDrawable(getResourceId(source)); return drawable; } } public int getResourceId(String name) { try { // 根據資源ID的變量名獲得Field的對象,使用反射機制來實現的 Field field = me.renhui.drag_sort_listview.R.drawable.class.getField(name); // 取得並返回資源的id的字段(靜態變量)的值,使用反射機制 return Integer.parseInt(field.get(null).toString()); } catch (Exception e) { e.printStackTrace(); } return 0; }
4.TextView單擊鏈接觸發點擊事件(本例事件是彈出Activity也可以替換為其他事件)
通過對TextView的內容設置span來給TextView設置點擊事件,這樣的話就能夠通過點擊點擊TextView中的鏈接來彈出Activity
String text1 = "彈出Activity1"; String text2 = "彈出Activity2"; SpannableString spannableString = new SpannableString (text1); SpannableString spannableString2 = new SpannableString (text2); spannableString.setSpan(new ClickableSpan() { @Overrride public void onclick(View widge) { // TODO 實現彈出邏輯 } }, 0, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
5.TextView實現跑馬燈的效果
基本的實現方式就是在xml設置TextView的屬性:
android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" // 不添加這個屬性不能成功跑動起來
6. TextView 實現刪除線的效果
設置刪除線的方式如下:
通過按位或運算符|,將 TextView 原本的 Flags 屬性和刪除線一塊設置。setPaintFlags內會對 TextView 進行重繪:
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
獲取畫筆后設置屬性,重繪 TextView 。此方式有個問題,會把 TextView 原本的 Flags 屬性替代,例如抗鋸齒等。仔細查看,你會發現通過這種方式,文字有了鋸齒。此時需要添加如下代碼來優化一下:
tv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
tv.invalidate();
TextView 取消刪除線有兩種方式:
方式一(推薦):
先對 Paint.STRIKE_THRU_TEXT_FLAG 屬性取反,再用按位與運算符&,除去了刪除線屬性並保留了 TextView 原本的 Flags 屬性。setPaintFlags內會對 TextView 進行重繪。
tv.setPaintFlags(tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
方式二:
獲取畫筆后,清空 Flags 屬性,再重繪 TextView 。此方式有個問題,會把 TextView 原本的所有 Flags 屬性清空,例如抗鋸齒等。仔細查看,你會發現通過這種方式,文字有了鋸齒;
tv.getPaint().setFlags(0);
tv.invalidate();
7. TextView 出現異常換行的處理方法
// 半角轉換成全角 private String toSBC(String input) { char c[] = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == ' ') { c[i] = '\u3000'; } else if (c[i] < '\177') { c[i] = (char) (c[i] + 65248); } } return new String(c); } // 全角轉換成半角 private String toDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 12288) { //全角空格為12288,半角空格為32 c[i] = (char) 32; continue; } if (c[i] > 65280 && c[i] < 65375) //其他字符半角(33-126)與全角(65281-65374)的對應關系是:均相差65248 c[i] = (char) (c[i] - 65248); } return new String(c); }
8. TextView 一行,最多顯示10個字符,剩余的用...代替
mTitleTxt.setSingleLine(); // 單行顯示 mTitleTxt.setMaxEms(10); // 最大十個字符 mTitleTxt.setEllipsize(TextUtils.TruncateAt.END); // 剩余的以...結尾
9. TextView 展示字母的時候,明明是小寫,但界面上看到的都是大寫 解決方案
添加屬性:
android:textAllCaps="false"
這個問題也存在於Button等其他控件,解決的方案同TextView。