Android TextView使用HTML处理字体样式、显示图片等

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdx_1136346879/article/details/86088428

Android TextView使用HTML处理字体样式、显示图片等
2012-07-19 18:1625499人阅读评论(30)收藏举报
学Android的时候突然想到一个问题:怎么用TextView控件显示带有格式的文字,可否使用Html布局?查了下Android 帮助文档,其提供了android.text.Html类和Html.ImageGetter、Html.TagHandler接口。
其实本不打算写这篇博文的,但看到网络上关于此的文章,基本是:你抄我,我抄你,大家抄来抄去,有用的也就那么一两篇文章,而且说得不明不白,网络就是如 此,盗版也成为了一种文化,这就是所谓的拿来主义吧。当然不否认大牛的辛勤劳作,写出的高质量文章;其次是学以致用,个人习惯–总结一下。

    我们平常使用TextView的setText()方法传递String参数的时候,其实是调用的public final void setText (CharSequence text)方法:

[java]view plaincopy

1 /**
2 * Sets the string value of the TextView. TextView does not accept
3 * HTML-like formatting, which you can do with text strings in XML resource files.
4 * To style your strings, attach android.text.style.* objects to a
5 * {@link android.text.SpannableString SpannableString}, or see the
6 *
7 * Available Resource Types
documentation for an example of setting
8 * formatted text in the XML resource file.
9 *
10 * @attr ref android.R.styleable#TextView_text
11 */
12 @android.view.RemotableViewMethod
13 public final void setText(CharSequence text) {
14 setText(text, mBufferType);
15 }
而String类是CharSequence的子类,在CharSequence子类中有一个接口Spanned,即类似html的带标记的文本,我们可以用它来在TextView中显示html。但在上面Android源码注释中有提及TextView does not accept HTML-like formatting。
android.text.Html类共提供了三个方法,可以到Android帮助文档查看。
[java]view plaincopy

16 public static Spanned fromHtml (String source)
17
18 public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
19
20 public static String toHtml (Spanned text)

   通过使用第一个方法,可以将Html显示在TextView中:

[java]view plaincopy

21 public void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.main);
24
25 TextView tv=(TextView)findViewById(R.id.textView1);
26 String html=“TextView 使用HTML

强 调

斜体


27 +"

<a href=“http://www.dreamdu.com /xhtml/”>超链接HTML入门学习HTML!< /p>

<font color="#aabb00">颜色1"
28 +"

<font color="#00bbaa “>颜色2

标题1

标题2< /h3>

标题3

大于>小于<

” +
29 “下面是网络图片

<img src=“ http://avatar.csdn.net/0/3/8/2_zhang957411207.jpg”/>”;
30
31 tv.setMovementMethod(ScrollingMovementMethod.getInstance());//滚动
32 tv.setText(Html.fromHtml(html));
33 }
效果:

    可以看出,字体效果是显示出来了,但是图片却没有显示。要实现图片的显示需要使用Html.fromHtml的另外一个重构方法:public static Spanned fromHtml (String source, Html.ImageGetterimageGetter, Html.TagHandler tagHandler)其中Html.ImageGetter是一个接口,我们要实现此接口,在它的getDrawable(String source)方法中返回图片的Drawable对象才可以。

修改后的代码:
[java]view plaincopy

34 ImageGetter imgGetter = new Html.ImageGetter() {
35 public Drawable getDrawable(String source) {
36 Drawable drawable = null;
37 URL url;
38 try {
39 url = new URL(source);
40 drawable = Drawable.createFromStream(url.openStream(), “”); //获取网路图片
41 } catch (Exception e) {
42 return null;
43 }
44 drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
45 .getIntrinsicHeight());
46 return drawable;
47 }
48 };

这里主要是实现了Html.ImageGetter接口,通过图片的URL地址获取相应的Drawable实例。
不要忘了在Mainifest文件中加入网络访问的权限:

[java]view plaincopy

49

友情提示:通过网络获取图片是一个耗时的操作,最好不要放在主线程中,否则容易引起阻塞。
上面介绍的是显示网络上的图片,但如何显示本地的图片呢:

[java]view plaincopy

50 ImageGetter imgGetter = new Html.ImageGetter() {
51 public Drawable getDrawable(String source) {
52 Drawable drawable = null;
53
54 drawable = Drawable.createFromPath(source); //显示本地图片
55 drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
56 .getIntrinsicHeight());
57 return drawable;
58 }
59 };
只需将source改为本地图片的路径便可,在这里我使用的是:
[java]view plaincopy

60 String source;
61 source=getFilesDir()+"/ic_launcher.png";

猜你喜欢

转载自blog.csdn.net/wdx_1136346879/article/details/86088428