整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

TextView实现Android图文混排显示HTML内容

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浏览器中背景图片的显示质量,减少模糊的问题。