怎么用TextView控件显示带有格式的文字,可否使用Html布局?查了下Android 帮助文档,其提供了android.text.Html类和Html.ImageGetter、Html.TagHandler接口。
先看截图:
我们平常使用TextView的setText()方法传递String参数的时候,其实是调用的public final void setText (CharSequence text)方法:
而String类是CharSequence的子类,在CharSequence子类中有一个接口Spanned,即类似html的带标记的文本,我们可以用它来在TextView中显示html。但在上面Android源码注释中有提及TextView does not accept HTML-like formatting。
android.text.Html类共提供了三个方法,可以到Android帮助文档查看。
通过使用第一个方法,可以将Html显示在TextView中:
效果:
可以看出,字体效果是显示出来了,但是图片却没有显示。要实现图片的显示需要使用Html.fromHtml的另外一个重构方法:public static Spanned fromHtml (String source, Html.ImageGetterimageGetter, Html.TagHandler tagHandler)其中Html.ImageGetter是一个接口,我们要实现此接口,在它的getDrawable(String source)方法中返回图片的Drawable对象才可以。
修改后的代码:
这里主要是实现了Html.ImageGetter接口,通过图片的URL地址获取相应的Drawable实例。
不要忘了在Mainifest文件中加入网络访问的权限:
友情提示:通过网络获取图片是一个耗时的操作,最好不要放在主线程中,否则容易引起阻塞。
上面介绍的是显示网络上的图片,但如何显示本地的图片呢:
只需将source改为本地图片的路径便可,在这里我使用的是:
项目中使用:
MsgNoticeDetailActivity.java中
updateUI(MsgChatListDetailItemBean.NoticeMsg notice) { mTvTitle.setText(notice.alert); mImgGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { final UrlDrawable urlDrawable= new UrlDrawable(); createRequest(source.startsWith("http") ? source : AppUtils.baseURL() + source) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<byte[]>() { @Override public void onCompleted() { mTvContent.invalidate(); } @Override public void onError(Throwable throwable) { mTvContent.invalidate(); } @Override public void onNext(byte[] bytes) { if (bytes != null && bytes.length > 0) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; // 对于大部分BMP格式文件不适用 options.inSampleSize = 2; Bitmap bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); Drawable drawable = new BitmapDrawable(getResources(), bm); int width = bm.getWidth(); int height = bm.getHeight(); int newWidth = width; int newHeight = height; if( width > mTvContent.getWidth() ) drawable.setBounds(0, 0, 0 + newWidth, 0 + newHeight); urlDrawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); urlDrawable.drawable = drawable; urlDrawable.invalidateSelf(); mTvContent.invalidate(); mTvContent.setText(mTvContent.getText()); // 神奇的一行,解决图文重叠问题 } } }); return urlDrawable; } }; mTvContent.setText(Html.fromHtml(notice.content, mImgGetter, null)); mTvDesc.setText(String.format("来自:%s\t\t发表于:%s", notice.author, notice.time)); mTvReadCount.setText(String.format("阅读:%s\t\t赞:%s", notice.readNum, notice.starNum)); }