from: http://labs.ywlx.net/?p=435

 所谓图文并茂是指在一篇文章里,图片和文字互相陪衬,使内容丰富多彩。例如我们最常使用到的聊天工具,都是这样。其实实现这个功能很简单,只用有一些细节性的问题需要注意,现在让我们一起来学习。

如图,最后一条消息就是图片加文字,重要代码:

SpannableString spannable = new SpannableString(str);//str为初始的字符串

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

ImageSpan imgSpan = new ImageSpan(bm);

spannable.setSpan(imgSpan, start, end, Spanned.

SPAN_EXCLUSIVE_EXCLUSIVE);//此处实现是吧spannable从start位开始到end位结束替换成imgSpan

最后只用把spannable给TextView设置上即可。

一个简单的图文并茂就实现了,这是在TextView上,但是如果在EditText上,我们就应该注意到很多的问题了:

第一,加上图片后需要能够输入文字;

第二,图片需要能够删除;

第三,图片需要加在光标所显示的位置;

贴出点击表情后程序所做的事:

EditText edit = (EditText)view.findViewById(R.id.edit_body);

int cursor = edit.getSelectionEnd();

String strSymbol = SmsConstant.ARR_BIAOQING[arg2];

edit.getText().insert(cursor, strSymbol);

SpannableString spannStr = new SpannableString(edit.getText());

int iResID = linear.getContext().getResources().getIdentifier(“biaoqing_”+arg2,

“drawable”, linear.getContext().getPackageName());

Bitmap bm = BitmapFactory.decodeResource(linear.getContext().getResources(), iResID);

ImageSpan imgSpan = new ImageSpan(bm);

spannStr.setSpan(imgSpan, cursor, cursor+strSymbol.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

edit.setText(spannStr);

edit.setSelection(cursor+strSymbol.length());

代码应该很好理解,

我们需要注意的是在setSpan()方法中,最后一个参数应该是Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这样才可以删除,

关于图片显示到光标的位置只用如上获取到光标的位置即可,

这个功能实现起来很简单,也容易理解,只是本人愚笨在第一次处理的时候遇到了一些比较头痛的问题,给大家一个友情提示,图文并茂的时候建议不要使用gif格式的图片,因为会有时出现无法显示光标的问题,但是实际效果不会收到影响,只是视觉效果会收到影响。

关于图文并茂基本就完成了,大家一起学习,一起进步。

{再贴个监听键盘事件的问题,若要对EditText监听键盘事件,大家(指部分监听事件失败的童鞋)首先会想到setonkeylistener,孰不只这样只能监听到物理键盘,无法监听到软键盘,实际上应该是 addtextchangedlistener。}