ndroid 中的 TextView 組件常用于顯示文本內容,其實它也可以顯示 HTML 的內容。簡單來講,這就需要先把 HTML 的內容以字符串的形式獲取后,經過 android.text.Html.fromHtml()轉化成 Spanned 的格式,然后將其傳遞到 TextView 的 setText()方法中,這樣就可以在 TextView 中顯示 HTML 頁面的內容了。需要注意的是,并不是所有的 HTML 標簽在 TextView 中都是支持的,且官方文檔并沒有明確的說明支持 HTML 標簽列表,通過查看 Android 源代碼,可以得到簡單的支持列表。
{<br>,< p>,< div align=>,< strong>, <b>, <em>, <cite>, <dfn>, <i>, <big>, <small>, <font size=>, <font color=>, <blockquote>, <tt>, <a href=>, <u>, <sup>, <sub>, <h1>,<h2>,<h3>,<h4>,<h5>,<h6>, <img src=>, <strike>}
1
下面的示例來介紹如何在 TextView 中顯示一段 HTML 內容,要顯示的這段 HTML 內容即包含超鏈接內容,也包含有圖片。
在 TextView 中顯示 HTML 內容
顯示的過程中最主要的過程就是調用 Android.text.Html 類提供的 fromHtml()方法,將一段 HTML 內容轉化為 Spanned 對象。
Android.text.Html 類提供的 fromHtml()方法使用如下清單 4
fromHtml()方法定義
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
……
HtmlToSpannedConverter converter =
new HtmlToSpannedConverter(source, imageGetter, tagHandler, parser);
return converter.convert();
}
1234567
source,就是包含 HTML 內容的字符串。而 Html.ImageGetter 和 Html.TagHandler 是兩個接口,提供給開發者繼承使用。
imageGetter, 如果要顯示圖片是需要被繼承的,重寫 getDrawable(String source)方法,用于獲取 HTML 里面的圖片來顯示在 TextView 中。
tagHandler,其作用是把 HTML 帶標記的文本內容字符串轉化成可以顯示效果的的 Spanned 字符串 。由于并非所有的 HTML 標簽都可以轉化,所以在使用時,用戶需要自己添加一些必要的標簽和處理方法時才會繼承使用的。
在本例中使用 fromHtml()方法之前,要準備好該方法要用的三個參數內容,首先將 HTML 字符串內容準備好,在項目中需要創建兩個類 MImageGetter 和 MTagHandler 分別繼承于 ImageGetter 和 TagHandler,分別用戶圖片的獲取,和特殊標簽的支持。
MImageGetter
繼承于 ImageGetter,重寫 getDrawable (String source) 方法中從 assets 路徑下取出的圖片流(這里當然也可以通過網絡操作來完成圖片流的獲取),最后獲得可供顯示的圖片對象,例如 Drawable 對像。由于 Android 設備的異構性,為了有更好的顯示效果,通常需要獲取屏幕大小,然后調用 drawable.setBounds () 還可以重新設置圖片的大小, 最后返回合適大小的圖片 Drawable 對象。 由此 Spanned 中的 ImageSpan 就獲得了圖像被顯示在 TextView 中對應位置了。
TypedValue typedValue = new TypedValue();
typedValue.density = TypedValue.DENSITY_DEFAULT;
drawable = Drawable.createFromResourceStream(null, typedValue, is, "src");
DisplayMetrics dm = c.getResources().getDisplayMetrics();
int dwidth = dm.widthPixels-10;//padding left + padding right
float dheight = (float)drawable.getIntrinsicHeight()*(float)dwidth/(float)drawable.getIntrinsicWidth();
int dh = (int)(dheight+0.5);
int wid = dwidth;
int hei = dh;
drawable.setBounds(0, 0, wid, hei);DisplayMetrics dm = c.getResources().getDisplayMetrics();
12345678910
MTagHandler
繼承于 TagHandler,重寫了 handleTag()方法,為的是支持部分標簽,這四個標簽是在 formHtml()方法中本身是不支持。如果開發者認為安卓 TagHandler 提供的默認標簽解析已經夠用,直接在 fromHtml()方法中第三個參數的地方填寫 null 既可。
重寫 handleTag()方法
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
if (tag.equals("ul") || tag.equals("ol") || tag.equals("dd")) {
if (opening) {
mListParents.add(tag);
} else mListParents.remove(tag);
} else if (tag.equals("li") && !opening) {
handleListTag(output);
}
}
private void handleListTag(Editable output) {
……
}
123456789101112
最后,在完成了 MImageGetter、MTagHandler 以后,就可以通過 formHtml()方法將 HTML 內容轉化為可供顯示的 SpannableString,將 SpannableString 通過 setText 方法放入 TextView 中,就可以顯示圖文并茂的內容了。
progressBar.setVisibility(View.GONE);
text.setText(Html.fromHtml(htmlCont, new MImageGetter(text,MainActivity.this), new MTagHandler()));
text.setVisibility(View.VISIBLE);
123
MImageGetter、MTagHandler 如下:
extView不僅可以用于顯示豐富的文本信息,還可以用來顯示圖文并茂的混排頁面。
1.TextView常用屬性
TextView的常用屬性有以下一些:
Java方法 | 說明 | XML配置 |
---|---|---|
setText() | 設置文本內容 | android:text |
setTextSize() | 設置文本字體大小 | android:textSize |
setTextColor() | 設置文本顏色 | android:textColor |
setBackgroundColor() | 設置背景顏色 | android:background |
此外,還可以在xml中設置一些TextView的屬性,PPT中有提供相關的屬性介紹
XML設置屬性 | 說明 |
---|---|
android:autoLink | 設置是否顯示為可點擊的鏈接。可選值(none/web/email/phone/map/all) |
android:drawableBottom | 在text的下方輸出一個drawable(圖片) |
android:drawableLeft | 在text的左邊輸出一個drawable(圖片) |
android:drawableRight | 在text的右邊輸出一個drawable(圖片) |
android:drawableTop | 在text的正上方輸出一個drawable(圖片) |
android:drawablePadding | 設置text與drawable(圖片)的間隔,與drawableLeft、drawableRight、drawableTop、 |
drawableBottom一起使用,可設置為負數,單獨使用沒有效果 | |
android:ellipsize | 設置當文字過長時,該控件該如何顯示。可設置如下屬性值:"start"省略號顯示在開頭; |
"end”省略號顯示在結尾;"middle"省略號顯示在中間; "marquee" 以跑馬燈的方式顯示(動畫橫向移動) | |
android:gravity | 設置文本位置,設置成"center",文本將居中顯示 |
android:linksClickable | 設置點擊時是否鏈接,即使設置了autoLink |
android:marqueeRepeatLimit | 在ellipsize設定為marquee時,設置重復滾動的次數,設置為marquee_forever時表示無限次。 |
android:lines | 設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據 |
android:shadowRadius | 設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好 |
android:shadowColor | 指定文本陰影的顏色,需要與shadowRadius一起使用 |
android:singleLine | 設置單行顯示 |
android:textColorLink | 設置文字鏈接的顏色 |
android:textScaleX | 設置文字之間間隔,默認為1.0f |
android:textStyle | 設置字形 bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2, 可以設置一個或多個,用“|”隔開 |
android:typeface | 設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體) 3 |
1.TextView中設置多種字體大小
像這樣的兩種字體大小放到一個TextView中,我們應該如何處理呢?需要用到 android.text 命名空間下的一些與 spannable相關的類和接口。
代碼如下:
public class TextViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_view); String text = "您已經連續走了1000步"; int start = text.indexOf("1"); int end = text.length(); //對字體大小進行設置 Spannable textSpan = new SpannableStringBuilder(text); textSpan.setSpan(new AbsoluteSizeSpan(16), 0, start, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textSpan.setSpan(new AbsoluteSizeSpan(26), start, end - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textSpan.setSpan(new AbsoluteSizeSpan(16), end - 1, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE); //獲取元素對象 TextView tv = (TextView) findViewById(R.id.txt1); //賦值操作 tv.setText(textSpan); }}
2.TextView中設置超鏈接
這個比較簡單,設置我們上邊提到的android:autoLink屬性,默認為none
代碼中的設置方式:setAutoLinkMask(int)。
參數和上邊列表對應,分別為:Linkify.WEB_URLS,Linkify.EMAIL_ADDRESSES,Linkify.PHONE_NUMBERS,Linkify.MAP_ADDRESSES,Linkify.ALL
但是需要注意的是,當我們需要定制超鏈接的跳轉時應該怎么做?答案是還是選擇Spannable。代碼如下:
效果圖
完整代碼
package com.hanpang.textviewdemo;import android.content.Intent;import android.graphics.Color;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.Spannable;import android.text.SpannableString;import android.text.SpannableStringBuilder;import android.text.Spanned;import android.text.method.LinkMovementMethod;import android.text.style.AbsoluteSizeSpan;import android.text.style.ClickableSpan;import android.text.style.ForegroundColorSpan;import android.text.style.UnderlineSpan;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class TextViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_view); TextView tv2 = (TextView) findViewById(R.id.txt2); //將TextView的顯示文字設置為SpannableString tv2.setText(getClickableSpan()); //設置該句使文本的超連接起作用 tv2.setMovementMethod(LinkMovementMethod.getInstance()); } //設置超鏈接文字 private SpannableString getClickableSpan() { SpannableString spanStr = new SpannableString("使用該軟件,即表示您同意該軟件的使用條款和隱私政策"); //設置下劃線文字 spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設置文字的單擊事件 spanStr.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(TextViewActivity.this,"點擊了使用條款的連接",Toast.LENGTH_SHORT).show(); } }, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設置下劃線文字 spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設置文字的單擊事件 spanStr.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(TextViewActivity.this,"點擊了隱私政策的連接",Toast.LENGTH_SHORT).show(); } }, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //設置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spanStr; }}
3.TextView 設置陰影
簡單了解一下 Android中設置陰影也比較簡單,xml中可以這樣設置:
android:shadowColor //指定文本陰影的顏色android:shadowDx //設置陰影橫向坐標開始位置android:shadowDy //設置陰影縱向坐標開始位置android:shadowRadius //設置陰影的半徑。設置為0.1會變成字體的顏色
代碼中通過方法public void setShadowLayer (float radius, float dx, float dy, int color)來設置。
代碼如下
<TextView android:shadowColor="#FF0000" android:shadowDx="10.0" android:shadowDy="5.0" android:shadowRadius="2.5" android:text="我是胖先森" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView3" />
4.字體加粗或者傾斜
在xml布局文件中使用android:textStyle=”bold”可以將文字設置成粗體。
在代碼中設置的方法是:使用TextPaint的仿“粗體”設置setFakeBoldText為true。
tv.getPaint().setFakeBoldText(true);
textstyle可設置的屬性有:
5.文字過長顯示省略號或者跑馬燈效果
android:maxEms="6" //限制顯示的字符長度android:singleLine="true" //單行顯示android:ellipsize="end"http://在結尾用省略號
android:ellipsize設置當文字過長時,該控件該如何顯示。有如下值設置:
”start”—–省略號顯示在開頭;
”end”——省略號顯示在結尾;
”middle”—-省略號顯示在中間;
”marquee” ——以跑馬燈的方式顯示(動畫橫向移動)
android:marqueeRepeatLimit 在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為marquee_forever時表示無限次。實現需要控件獲得焦點。
<TextView android:marqueeRepeatLimit="marquee_forever" android:ellipsize="marquee" android:singleLine="true" android:focusableInTouchMode="true" android:focusable="true" android:text="我是胖先森我是胖先森我是胖先森我是胖先森我是胖先森" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView3" />
效果圖
6.TextView 設置行間距
1、android:lineSpacingExtra 設置行間距,如”3dp”。
2、android:lineSpacingMultiplier 設置行間距的倍數,如”1.2″。
7.TextView 關于字體
我們可以通過設置android:typeface屬性來控制字體,可以設置為normal, sans, serif, monospace四種。具體如下:
代碼中可以通過setTypeface(Typeface)方法設置。但有時候我們的App可能需要使用特殊的字體,這時候怎么辦呢?可以通過如下代碼設置:
Typeface mTypeFace = Typeface.createFromAsset(getAssets(), "kaiti.ttf");textview.setTypeface(mTypeFace);
然后將我們的字體文件放到assets文件夾下。
但是需要注意的是,不要大量使用這種自定義字體,因為自定義字體會消耗更多的性能。
8.TextView支持的Html標簽
Textview只支持部分的html標簽。具體如下:
<a href="..."> //定義鏈接內容<b> //定義粗體文字 b 是blod的縮寫<big> //定義大字體的文字<blockquote> //引用塊標簽 <br> //定義換行<cite> //表示引用的URI<dfn> //定義標簽 dfn 是defining instance的縮寫<div align="..."><em> //強調標簽 em 是emphasis的縮寫<font size="..." color="..." face="..."><h1><h2><h3><h4><h5><h6><i> //定義斜體文字<img src="..."><p> // 段落標簽,里面可以加入文字,列表,表格等<small> //定義小字體的文字<strike> // 定義刪除線樣式的文字 不符合標準網頁設計的理念,不贊成使用. strike是strikethrough的縮寫<strong> //重點強調標簽<sub> //下標標簽 sub 是subscript的縮寫<sup> //上標標簽 sup 是superscript的縮寫<tt> //定義monospaced字體的文字 不贊成使用. 此標簽對中文沒意義 tt是teletype or monospaced text style的意思<u> //定義帶有下劃線的文字 u是underlined text style的意思
9.TextView 顯示多種顏色的字
Android支持html格式的字符串,通過調用Html.fromHtml(str)方法可以轉換html格式的字符串str。示例代碼如下:
TextView textth = (TextView) findViewById(R.id.textth);String textStr1 = "<font color="\"#123569\"">如果有一天,</font>";String textStr2 = "<font color="\"#00ff00\"">我悄然離去</font>";textth.setText(Html.fromHtml(textStr1 + textStr2));
10.TextView 字體加粗
字體加粗還可以通過設置html格式字符串來實現
String textStr1 = "<b>sdfa</b>";textth.setText(Html.fromHtml(textStr1));
11.TextView 插入圖片
插入圖片還可以用html字符串來實現。不過需要用到ImageGetter類來對圖片的src屬性進行轉換。
代碼如下:
package com.hanpang.textviewdemo;public class TextViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_text_view); String imgStr = "<b>sdfa</b><br><img src='"+R.drawable.abc+"'>"; Html.ImageGetter imageGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); Drawable draw = getResources().getDrawable(id); draw.setBounds(0, 0, 300, 200); return draw; } }; TextView tv = (TextView) findViewById(R.id.txt1); tv.append(Html.fromHtml(imgStr, imageGetter, null)); }}
12.TextView 添加分割線
<TextView android:layout_width="match_parent" android:layout_height="1dp" android:background="#000000" />
extView屬性
設置是否當文本為URL鏈接/email/電話號碼/map時,文本顯示為可點擊的鏈接。可選值(none/web/email/phone/map/all)
如果設置,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法并輸入的時候起作用。
指定getText()方式取得的文本類別。選項:
設置英文字母大寫類型。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
設定光標為顯示/隱藏,默認顯示。
設置允許輸入哪些字符。如“1234567890.+-*/% ()”
在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,并且同時和background使用時覆蓋后者。
在text的左邊輸出一個drawable,如圖片。
設置text與drawable(圖片)的間隔,與drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可設置為負數,單獨使用沒有效果。
在text的右邊輸出一個drawable。
在text的正上方輸出一個drawable。
設置是否可編輯。
設置文本的額外的輸入數據。
設置當文字過長時,該控件該如何顯示。有如下值設置:
設置保存文本的內容以及光標的位置。
設置文本位置,如設置成“center”,文本將居中顯示。
為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在 EditView中使用,但是這里也可以用。
附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個“完成”,而不設置默認是一個回車符號。這個在EditView中有詳細說明,此處無用。
設置IME動作ID。
設置IME動作標簽。
設置文本是否包含頂部和底部額外空白,默認為true。
為文本指定輸入法,需要完全限定名(完整的包名)。例如:
com.google.android.inputmethod.pinyin,但是這里報錯找不到。
設置文本的類型,用于幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
設置鏈接是否點擊連接,即使設置了autoLink。
在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為marquee_forever時表示無限次。
設置TextView的寬度為N個字符的寬度。這里測試為一個漢字字符寬度
設置TextView的寬度為最長為N個字符的寬度。與ems同時使用時覆蓋ems選項。
設置TextView的寬度為最短為N個字符的寬度。與ems同時使用時覆蓋ems選項。
限制顯示的文本長度,超出部分不顯示。
設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據。
設置文本的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
設置文本的最小行數,與lines類似。
設置行間距。
設置行間距的倍數。如“1.2”
如果被設置,該TextView有一個數字輸入法。此處無用,設置后唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。
以小點”.”顯示文本
設置為電話號碼的輸入方式。
設置輸入法選項,此處無用,在EditText將進一步討論。
設置文本超出TextView的寬度的情況下,是否出現橫拉條。
如果文本是可選擇的,讓他獲取焦點而不是將光標移動為文本的開始位置或者末尾位置。 TextView中設置后無效果。
指定文本陰影的顏色,需要與shadowRadius一起使用。
設置陰影橫向坐標開始位置。
設置陰影縱向坐標開始位置。
設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,后面用“…”來表示。如
將只顯示“t…”。如果不設置singleLine或者設置為false,文本將自動換行
設置顯示文本.
設置文字外。如 “?android:attr/textAppearanceLargeInverse”這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否 則使用默認的外觀。可textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
設置文本顏色
被選中文字的底色,默認為藍色
設置提示信息文字的顏色,默認為灰色。與hint一起使用。
文字鏈接的顏色.
設置文字之間間隔,默認為1.0f。
設置文字大小,推薦度量單位”sp”,如”15sp”
設置字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設置一個或多個,用“|”隔開
設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體) 3]
設置文本區域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)
設置文本區域的最大高度
設置文本區域的最小高度
設置文本區域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width 的區別看這里。
設置文本區域的最大寬度
設置文本區域的最小寬度
(本文由沙海孤塵原創,歡迎關注,帶你一起長知識!)
*請認真填寫需求信息,我們會在24小時內與您取得聯系。