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. vue组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了一下的内容.首先会对使用Vue进行开发的一些前期需要的技术储备进行简单 ...

  2. 32.使用来MethodFilterInterceptor灵活拦截

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 步骤一.建立MethodAction,代码如下: package com.a ...

  3. MySQL 常用命令行

    增加新用户 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码" 如,增加一个用户user1密码为password1,让其可以在本 ...

  4. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  5. Inception

    http://baijiahao.baidu.com/s?id=1601882944953788623&wfr=spider&for=pc

  6. Shiro01 功能点框图、架构图、身份认证逻辑、身份认证代码实现

    基本功能点 功能点框图 功能点说明 1.Authentication:身份认证/登录,验证用户是不是拥有相应的身份: 2.Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个 ...

  7. A survey of best practices for RNA-seq data analysis RNA-seq数据分析指南

    A survey of best practices for RNA-seq data analysis RNA-seq数据分析指南 内容 前言 各位同学/老师,大家好,现在由我给大家讲讲我的文献阅读 ...

  8. CF 990 Educational Codeforces Round 45

    既然补了就简单记录一下. 感觉还算有一点营养. 官方题解传送门:点我 A Commentary Boxes 对拆掉$n \mod m$个和新建$m - (n \mod m)$求个最小. #includ ...

  9. code3286 火柴排队

    这道题目相当于是让我们把a,b对齐,即a中第i大的数与b中第i大的数下标相同一看到交换次数,很容易让人想到归并排序我的做法是这样的就样例而言:a:1 3 4 2b:1 7 2 4读进来之后先处理a,b ...

  10. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...