1. TextView 中嵌套图片的方法

TextView textView...
textView.setText("...");
textView.append(Html.fromHtml("<imgsrc='"+R.drawable.question+"'/>",imageGetter, new MTagHandler(context)));

就是在 TextView 中加入包含图片的 html 代码。

Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)

  • 其中 source 里面放 html 代码,里面加入图片的资源ID(R.id.xxx)。
  • ImageGetter 是一个接口,里面有抽象方法 public Drawable getDrawable(String source); 用来获取图片的 Drawable 对象(可以从网络,或 res 资源,或本地文件获取,本例中从 res 中获取)。
  • TagHandler 是一个接口,用来处理 html 标签。当我们遇到一个 html 标签后,做相应的处理工作,比如点击的响应。

2. TextView 中嵌套图片的点击响应

ImageGetter 的实现:

ImageGetter imageGetter = new ImageGetter() { 

        @Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);
Drawable drawable = context.getResources().getDrawable(id);
drawable.setBounds(int left, int top, int right, int bottom);
return drawable;
}
};

TagHandler 的实现:

    public class MTagHandler implements TagHandler {
private int sIndex = 0;
private int eIndex = 0;
private final Context mContext; public MTagHandler(Context context) {
mContext = context;
} public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
// TODO Auto-generated method stub
if (tag.toLowerCase().equals("img")) {
if (opening) {
sIndex = output.length();
} else {
eIndex = output.length();
output.setSpan(new MSpan(), sIndex, eIndex,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
} private class MSpan extends ClickableSpan implements OnClickListener {
@Override
public void onClick(View widget) {
// TODO Auto-generated method stub
Log.e("test", "aaaaaaaaaaaa");
Toast.makeText(context, "sdfdsfsdfdsf", 1000).show();
}
}
}

碰到 img 标签后做 onClick 里的响应处理。

最后,非常重要的一件事,就是要给 TextView 做个设置,否则点击不会相应。

textView.setMovementMethod(LinkMovementMethod.getInstance());

3. TextView 中部分文字的点击相应

这里需要使用 SpannableString(不可变) 或 SpannableStringBuilder(可变)。

  首先,创建一个 SpannbleString:

  SpannableString spannableString = new SpannableString("xxxx");

spannableString.setSpan(Object what, int start, int end, int flags);

    Object what 这里放一个 ClickableSpan,并实现它的 onClick 方法用于点击相应。

    int start,int end 定义字符串的区间。

    int flags 表示样式。在 Spanned 类中有很多参数可供使用。常用的是  Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
// TODO Auto-generated method stub
// 要做的事写在这里
}
},0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

  然后把 TextView 的文字内容设置为 SpannbleString:

    textView.setText(spannableString);

  最后,同样的,非常重要的一件事,就是要给 TextView 做个设置,否则点击不会相应。

  textView.setMovementMethod(LinkMovementMethod.getInstance());

4. TextView 中改变部分文字的颜色或背景颜色等

添加图片(不需要点击响应的话)可以用  ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);

改变部分文字颜色或背景:

mTextView = (TextView)findViewById(R.id.test);
SpannableString s = new SpannableString(mTextView.getText());
s.setSpan(new BackgroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //红色高亮
s.setSpan(new UnderlineSpan(), 15, 18,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //下划线
s.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  //字体红色
s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //斜体加黑
mTextView.setText(s);

一篇不错的写 SpannbleString 的文章:

http://ezfantasy.iteye.com/blog/1468631

http://www.apkbus.com/forum.php?mod=viewthread&tid=18983

5. TextView 中遇到的一个有趣的Bug

在一次实际应用中。我做了一个答题的程序。答了的题的标题前加上一个对号表示这个题回答过了。

我开始是这样做的:

SpannableString s = new SpannableString("✔ " + textTitle.getText());
s.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.custom_theme_color_green)), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textTitle.setText(s);

我另外有一个函数用来删除标题前的对号用来表示此题回答了之后又被取消了。

真正出现的问题是:

  我的 TextView 里加入过一个内嵌的小图片按钮,详情见最上面。然后当我添加/删除 小对号 "✔ " 之后,我的图片按钮突然不见了。

原因:

  带有 Span 的 TextView 的文字内容是 CharSequence 类型。为了让里面包含的 Span 不丢失,不可以对它进行类型转换。所以当我们进行添加对号时,必须用 TextView 的 append() 函数。像上面代码写的,文字内容被转换为 SpannableString 了,然后 Span 丢失了。为什么会这样呢,看了一下 SpannableString 的构造函数的源码才知道,new SpannableString(CharSequence source) 的时候,里面的 CharSequence 被执行了 source.toString(); 而 Span 就是这么丢的。

那么解决方法呢:

- 添加对号:

SpannableString s = new SpannableString("✔ ");
s.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.custom_theme_color_green)), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
CharSequence c = textTitle.getText();
textTitle.setText(s);
textTitle.append(c);

- 删除对号:

textTitle.setText(textTitle.getText().subSequence(2, textTitle.getText().length()));

Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色的更多相关文章

  1. 删除字符串中的"\U0000fffc"数据 textView添加图片 以及添加后属性失效的解决

    背景:在实现textView的富文本时,如果添加一张图片后,如果直接发送textView的内容时,图片会被字符串“\U0000fffc”替换. 问题:如何删除“\U0000fffc”字符串:如何替换t ...

  2. Android TextView中有图片有文字混合排列

    Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...

  3. Android编写点击TextView拨打电话

    在任何一个电商平台都会有点击了手机号码会拨打出一个电话 那么高如何实现这个功能,我们下来分析下原理 当我们点击了一个电话号码后,会弹出一个Dialog显示是否拨打次电话号码,点击确定拨打号码,点击取消 ...

  4. android TextView 例子代码(文字图片、文字省略、文字滚动)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  5. Android为TV端助力之点击Textview无效

    记录一下如果有两个Textview都有点击事件,那么不能给Textview同时设置 android:focusable="true"android:focusableInTouch ...

  6. Android学习笔记⑤——UI组件的学习TextView相关

    TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...

  7. 解析TextView中的URL等指定特殊字符串与点击事件

    使用TextView时,有时可能需要给予TextView里的特定字符串,比如URL,数字特别的样式,必希望能够添加点击事件.比如发短信时,文字里的url就可以点击直接打开浏览器,数字可以点击拨打电话. ...

  8. Android开发----开发工具的安装与TextView组件

    开发工具的安装 选择使用Android Studio进行开发,Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...

  9. TextView 设置图片

    TextView 设置图片 2012-05-17 15:12:38|  分类: Android |  标签:android  textview图片  |举报|字号 订阅     Drawable im ...

随机推荐

  1. shell脚本实现tomcat进程—查、杀、启

    #!/bin/bash#获取XXX项目进程IDXXXpid=`ps -ef | grep XXX | grep -v grep | awk '{print $2}'` echo "XXX项目 ...

  2. python新里程

    为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...

  3. NotePad++替换行前、行后空格,替换空行

    用 Notepad++ 打开,把每一个将要放在表中单元格的内容放一行(注: ^ 代表行首 $ 代表行尾) 去除行尾空格和空白行:按CTRL+H 选择正则表达式– 查找目标:\s+$ 替换为空 去除行首 ...

  4. 编程语言分类和Python解释器介绍

    主要内容: 一.编程语言分类和介绍 二.Python解释器分类和介绍 一.编程语言分类和介绍 1.编程语言分类 编程语言的发展依次经历了机器语言.汇编语言和高级语言. 2.编程语言的介绍   2.1 ...

  5. 非root用户使用1024以下端口

      如果你有一个最新的内核,确实有可能使用它作为非root用户启动服务,但绑定低端口.最简单有效的办法是: #setcap 'cap_net_bind_service=+ep' /path/to/pr ...

  6. OPENSSL 生成https 客户端证书

    下面说下拿服务器证书.(前提是服务器是https,客户端认证用的时候),服务端不给的时候,我们自己去拿(不给怼他!,哈哈,开个玩笑,都会给的) openssl s_client -connect 域名 ...

  7. animate.css动画种类

    animate.css 一个非常好用的css动画库 Github地址 包括了一下多种动画 1. bounce 弹跳 2. flash 闪烁 3. pulse 放大,缩小 4. rubberBand 放 ...

  8. 第四章 Windows的图形设备接口及Windows绘图 P83 4-6

    实验(实习)名称  图形程序设计及其应用  实验(实习)日期 一.实验目的 1.熟悉图形设备接口的概念及其应用. 二.实验内容及步骤  实验任务 1.熟悉基于图形应用的程序设计: 2.掌握刷新技术及其 ...

  9. Wap版

    Wap版:又叫h5.M版.移动网页版: Mobile:存储wap版调用的接口

  10. 主线程不能直接调用webservice方法

    @Overrideprotected void onCreate(Bundle savedInstanceState){//StrictMode.setThreadPolicy(new StrictM ...