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 如下:
實現新聞詳情的時候,安卓也有類似富文本的控件,但是使用webview或者textview等方法,每種方法各有優劣,不是很完美。今天給大家介紹一個安卓控件——HtmlTextView,實現詳情頁圖文混排的顯示。
1.在gradle引入控件
dependencies {
compile 'org.sufficientlysecure:html-textview:4.0'
}
123
2.在布局頁面使用上面的控件
<org.sufficientlysecure.htmltextview.HtmlTextView
android:id="@+id/html_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAppearance="@android:style/TextAppearance.Small" />
12345
3.在activity使用相關方法,此處是其他頁面網絡獲取解析傳遞過來的html內容,HtmlHttpImageGetter方法不需要手動編寫(較textview實現的時候不再需要重寫、繼承ImageGetter方法,可查看上篇博客)
public class ContentActivity extends BaseActivity {
private String htmlContents = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
HtmlTextView htmlTextView = findViewById(R.id.html_text);
final Intent intent = getIntent();
Bundle bundle = intent.getExtras();
htmlContents = bundle.getCharSequence("contents").toString();
htmlTextView.setHtml(htmlContents, new HtmlHttpImageGetter(htmlTextView));
}
}
123456789101112131415
4.讓我們看一下最終實現的效果
有相關疑問可以留言,感謝點贊轉發,禁止轉載
果在Android瀏覽器中查看背景圖片時出現模糊的問題,可以嘗試以下幾種解決方法:
1:使用高分辨率圖片: 確保背景圖片的分辨率足夠高,以適應不同的設備屏幕密度。提供高分辨率的圖片可以避免在高像素密度的設備上顯示模糊。
2:使用適當的圖片格式: 使用適當的圖片格式,如JPEG、PNG或WebP。根據圖片的特性和壓縮需求選擇合適的格式,以避免圖片在瀏覽器中顯示時失真或模糊。
3:設置背景圖片大?。?在CSS中設置背景圖片的大小,確保其與元素的大小匹配。使用background-size屬性可以控制背景圖片的尺寸,例如使用cover或contain來適應元素的大小。
4:使用CSS圖像漸進增強: 通過CSS的background-image屬性,使用漸進增強的方式提供多個備選的背景圖片。提供不同分辨率或不同壓縮程度的圖片,讓瀏覽器根據設備的特性選擇合適的圖片。
5:避免拉伸背景圖片: 避免在CSS中拉伸背景圖片,以免引起模糊效果。確保背景圖片的尺寸與顯示區域匹配,避免進行不必要的縮放或拉伸。
6:使用CSS濾鏡: 可以嘗試使用CSS的濾鏡效果來改善背景圖片的清晰度。例如,使用filter: none;來禁用瀏覽器默認的圖片濾鏡效果。
7:測試不同瀏覽器和設備: 在不同的Android瀏覽器和設備上進行測試,以確保背景圖片在各種環境下都能顯示清晰。不同的瀏覽器和設備可能對圖片的處理方式有所不同,因此需要做兼容性測試。
通過采取這些方法,可以提高Android瀏覽器中背景圖片的顯示質量,減少模糊的問題。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。