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 ...
随机推荐
- Maven配置本地仓库
当我们在myeclipse中update maven时可能会报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,以致于 ...
- Node.js 项目打包
Node项目基于Electron打包 Electron打包打包后项目.exe程序包含在文件夹中,基于Electron打包的基础上直接打包成exe程序 参考一 参考二 需求的软件环境: NSIS 2.4 ...
- linux之cut
[linux之cut] -b:字节 -c:字符 -d:自定义域 -f:域范围 参考:http://wenku.baidu.com/view/9399bc8383d049649b66588b.html
- codeforces:MEX Queries分析和实现
首先说明一下MEX,设S是自然数集合N的一个子集,那么S的MEX则为min(N\S),即不包含于S的最小自然数. 题目大意是存在一个空集S,提供n组输入(n<10^5),每组输入对应下面的一个指 ...
- Marshal.FreeHGlobal 方法 (IntPtr)
释放以前从进程的非托管内存中分配的内存. 命名空间: System.Runtime.InteropServices程序集: mscorlib(位于 mscorlib.dll) 下面的示例演示如何 ...
- file_get_contents()
file_get_contents()类似于curl接口调用
- Greeplum 系列(七) 权限管理
Greeplum 系列(七) 权限管理 一.角色管理 Role 分为用户(User)和组(Group),用户有 login 权限,组用来管理用户,一般不会有 login 权限.初始化 gp 时创建了一 ...
- 用MapReduce读HBase写MongoDB样例
1.版本信息: Hadoop版本:2.7.1 HBase版本:1.2.1 MongDB版本:3.4.14 2.HBase表名及数据: 3.Maven依赖: <dependency> < ...
- android studio导入项目时一直在Grandle Build Running
在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的情况,解决方法如下: 方法1:(亲测有效) 1.在C:\User\<用户名>\.gra ...
- 解决windows搭建jenkins执行selenium无法启动浏览器问题
因为jenkins是用windows installer 安装成windows的服务了,那么jenkins是一个后台服务,所以跑selium cases 的时候不显示浏览器 Step 1. Contr ...