安卓开发笔记——丰富多彩的TextView

随手笔记,记录一些东西~

记得之前写过一篇文章《安卓开发笔记——个性化TextView(新浪微博)》:http://www.cnblogs.com/lichenwei/p/4411607.html

文章里实现个性化TextView的主要方法是通过替换的方式,对关键字进行一些个性化处理,晚上再来补充一种实现方式。

老规矩,先看下效果图:

 

晚上带来的这种实现方式是通过Android官方给我们提供的Html类下面的fromHtml方法,这个方法可以对字符串进行HTML格式化,让TextView等一些控件"认识"HTML。

来看下官方文档对Html类的描述:

This class processes HTML strings into displayable styled text. Not all HTML tags are supported.

这个类使得HTML代码被识别显示,但并不支持所有的HTML代码,但对我们日常开发来说,已经足够使用了。

 

再来看下fromHtml方法

fromHtml有2个重载方法,下面我简单点来说:

1、当你需要转换的HTML代码是纯文字,比如超链接,换行符,邮件收发等,那么直接使用第一个方法即可,将你的文本信息直接传入方法。

 

2、当你需要转换的HTML代码是带图片的,比如<IMG/>,那么你就需要使用到重载的第二个方法了,这个方法里面有个ImageGetter对象,实现这个类会发现它回调了一个抽象getDrawable方法,在这个方法里,我们可以进行远程图片的下载获取,本地资源图片的获取等。第三个参数TagHandler是用来自定义一些不属于HTML代码的一些标签,一般我们不会去用到,直接置为null即可。

 

好了,直接用代码说话吧

 

这是布局文件,很简单就一个TextView

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5 >
 6 
 7     <TextView
 8         android:id="@+id/tv_1"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         />
12 
13 </RelativeLayout>

再来看下主代码

 1 package com.example.mytestdemo;
 2 
 3 import java.lang.reflect.Field;
 4 
 5 import android.app.Activity;
 6 import android.graphics.drawable.Drawable;
 7 import android.os.Bundle;
 8 import android.text.Html;
 9 import android.text.Html.ImageGetter;
10 import android.widget.TextView;
11 
12 public class MainActivity extends Activity {
13 
14     private TextView mTextView;
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20 
21         mTextView = (TextView) findViewById(R.id.tv_1);
22         String html = "<img src='liuhan'/>天气好热。。<p/><img src='haha'/>没关系,我有空调!";
23         
24         CharSequence charSequence = Html.fromHtml(html, new ImageGetter() {
25 
26             @Override
27             public Drawable getDrawable(String source) {
28                 //根据资源变量名称获取R资源Id,再根据资源Id获取到Drawable对象
29                 Drawable drawable = getResources().getDrawable(getResourceId(source));
30                 //对图片进行压缩(此处我采用原图)
31                 drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
32                 return drawable;
33             }
34         }, null);
35         //设置文本信息
36         mTextView.setText(charSequence);
37 
38     }
39     /**
40      * 根据资源文件的变量名返回资源文件的文件ID
41      * @param name
42      * @return
43      */
44     public int getResourceId(String name) {
45         try {
46             //利用Java反射机制获取R资源Id
47             Field field = R.drawable.class.getField(name);
48             return Integer.parseInt(field.get(null).toString());
49         } catch (NoSuchFieldException e) {
50             e.printStackTrace();
51         } catch (IllegalAccessException e) {
52             e.printStackTrace();
53         } catch (IllegalArgumentException e) {
54             e.printStackTrace();
55         }
56         return 0;
57     }
58 
59 }

 

这里的代码有个getResourceId方法,我用到了Java的反射机制,通过资源文件的变量名称获取到R文件的资源Id,这样方法我们在ImageGetter中获取Drawable对象。

然后可以利用Drawable下的setBounds方法对图片进行压缩,当然如果图片处理的好,不进行压缩也是可以的。

 

实现就这么简单,收工!

 

作者:Balla_兔子
出处:http://www.cnblogs.com/lichenwei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

posted @ 2015-06-30 23:13  李晨玮  阅读(1505)  评论(0编辑  收藏  举报