Android实现富文本时遇到的一些问题(1)效果嵌套
在做富文本的时候第一时间就是去看了看HTML在线编辑器的做法,HTML只需要对选中的这一个段落执行某个操作他就会自动加载效果或者取消效果,而且文本的存储就是当前的HTML。
然后在安卓上就没那么容易了,首先安卓的edittext里的字符存储是用spannablestring来存储的,SPAN就是区域区间,我的翻译就是带有区域特征的字符串
你可以对这个STR进行操作
spannableString.setSpan(style, start, end,Flag);
其中的STYLE就是字符的形式,例如加粗,下划线等,FLAG代表的是这个特征的应用形式 是左开右闭还是全开,还是全闭,具体参考REFERENCE
在你很愉快的编辑着效果的时候,你会发现编辑完了怎么保存呢?实例是不能存起来的,
当然,你犀利的话可以自己写个函数把SpannableString给解析出来
其实安卓也自带了处理方法
HTML.toHtml( SpannableString );
这个类负责把这个STRING转换成HTML,这样就好保存了,
如果你够仔细还会看到一个
HTML。fromHtml(string)
就是把你保存的HTML再给变回来,但是当你变回来之后你就会发现你想得太简单了
HTML这个类并没有为你想太多,甚至连嵌套的问题都解决不了。。。。
我是个比较懒的人,要我把整个解析和反解析写出来我会觉得太累,我就只好在输入输出之间加上自己的控制函数了
当你在为字符串添加效果的时候会遇到以下的情况
你需要做的就是对这几种情况做一个判断,然后把重叠部分的格式清除掉,然后再没有格式的部分加上你的新格式
switch (v.getId()) { /** * 加粗 */ case com.rockman.R.id.btn_blod: span_string = make_style_change(span_string, start, end, new StyleSpan(Typeface.BOLD)); break; /** * 斜体 */ case com.rockman.R.id.btn_ital: span_string = make_style_change(span_string, start, end, new StyleSpan(Typeface.ITALIC)); break; /** * 下划线 */ case com.rockman.R.id.btn_under_decorect: span_string = make_style_change(span_string, start, end, new UnderlineSpan()); break;
make_style_change(span_string, start, end, style);
你需要做的就是重载以上函数,对粗体的处理,对斜体的处理,对颜色的处理,对字体大小的处理
这样做完之后你得到的就是一个没有相同效果重叠的SPANABLESTRING了,接下来还会有PART2,讲我遇到的第二个问题