Android TextView 嵌套图片及其点击,TextView 部分文字点击,文字多颜色
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 部分文字点击,文字多颜色的更多相关文章
- 删除字符串中的"\U0000fffc"数据 textView添加图片 以及添加后属性失效的解决
背景:在实现textView的富文本时,如果添加一张图片后,如果直接发送textView的内容时,图片会被字符串“\U0000fffc”替换. 问题:如何删除“\U0000fffc”字符串:如何替换t ...
- Android TextView中有图片有文字混合排列
Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...
- Android编写点击TextView拨打电话
在任何一个电商平台都会有点击了手机号码会拨打出一个电话 那么高如何实现这个功能,我们下来分析下原理 当我们点击了一个电话号码后,会弹出一个Dialog显示是否拨打次电话号码,点击确定拨打号码,点击取消 ...
- android TextView 例子代码(文字图片、文字省略、文字滚动)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Android为TV端助力之点击Textview无效
记录一下如果有两个Textview都有点击事件,那么不能给Textview同时设置 android:focusable="true"android:focusableInTouch ...
- Android学习笔记⑤——UI组件的学习TextView相关
TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...
- 解析TextView中的URL等指定特殊字符串与点击事件
使用TextView时,有时可能需要给予TextView里的特定字符串,比如URL,数字特别的样式,必希望能够添加点击事件.比如发短信时,文字里的url就可以点击直接打开浏览器,数字可以点击拨打电话. ...
- Android开发----开发工具的安装与TextView组件
开发工具的安装 选择使用Android Studio进行开发,Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT, ...
- TextView 设置图片
TextView 设置图片 2012-05-17 15:12:38| 分类: Android | 标签:android textview图片 |举报|字号 订阅 Drawable im ...
随机推荐
- python3.6编程第一课画个五角星
使用的是海龟图库 turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...
- OpenCL 第一个计算程序,两向量之和
▶ 一个完整的两向量加和的过程,包括查询平台.查询设备.创建山下文.创建命令队列.编译程序.创建内核.设置内核参数.执行内核.数据拷贝等. ● C 代码 #include <stdio.h> ...
- 方便好使的java.util.Properties类
今天偶然碰到这个类,发现jdk中这些平时不大用到的类还挺好玩儿的,用起来也特别实在方便,随便写点记录下. java.util.Properties是对properties这类配置文件的映射.支持key ...
- Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F
问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varchar,字符编码utf-8.部分插入成功,部分插入失败,报错如标题. 在网上查询,有人说是编码问题,建议修改编码格式,比如改 ...
- 迷你MVVM框架 avalonjs 1.2.6发布
avalon.mobile 针对GCC压缩器进行优化 avalon.mobile对浏览器是否支持触屏使用更好的判定 监控数组的splice,remove,removeAt进行了重构,修改直接删掉列表的 ...
- ansible Developing Plugins
Action plugins是模块的前端,可以在调用模块本身之前对控制器执行操作. Cache plugins用于保存“facts”的缓存,以避免代价高昂的fact-gathering操作. Call ...
- BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3) (转)
声明:部分动画来源于网络,本人只是想方便收集在一起,如果不妥请及时与我联系!谢谢 为了统一BaseAnimationApp签名,一定要方便以后大家自动更新...防止签名冲突,不能及时更新 1.3源码下 ...
- nasm 与 masm语法区别
看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...
- WebService之SOAP
SOAP(Simple Object Access Protocol),它是一种标准消息传递协议,通常是Web Service的事实标准.SOAP是以XML为基础,SOAP消息格式是由XML Sche ...
- 23-python用BeautifulSoup用抓取a标签内所有数据
1.获取子标签: thr_msgs = soup.find_all('div',class_=re.compile('msg')) for i in thr_msgs: print(i) ...