这里提供一种不错的实现方法SpannableString
先取得图片资源
Drawable drawable = getResources().getDrawable(R.drawable.emoji1); drawable.setBounds(0, 0, 40, 40);
new一个SpannableString
SpannableString spannable = new SpannableString("芜湖大司马[smile]");把刚刚那个drawable转化成ImageSpan
ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);接下来的任务是用这个ImageSpan替换掉[smile],第二参数和第三参数定位了这个[smile],分别是他的开始坐标和结束坐标。
spannable.setSpan(span, ("芜湖大司马").length(), ("芜湖大司马[smile]").length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);最后setText
mTv.setText(spannable);
效果
进阶一下,比如你的输入框中是一串,包含了文字和[smile]的东西,我们遍历一下替换(因为你怎么知道用户输入的是什么,所以要满足重用性)
先setText,模拟一下用户的输入
mTv.setText("芜湖大司马[smile]你真帅[smile]");也还是取得图片资源
Drawable drawable = getResources().getDrawable(R.drawable.emoji1); drawable.setBounds(0, 0, 40, 40);也还是new一个SpannableString,不过这一次是以TextView中的文字来new的
SpannableString spannable = new SpannableString(mTv.getText());
把TextView中的文字放到数组里
CharSequence sequence = mTv.getText();开一个for循环遍历(为什么要每次new一个?因为他是一个对象,如果你只new一个对象,只有最后一个[smile]才会被替换掉)
for (int i = 0; i < sequence.length(); i ++) { if (sequence.charAt(i) == '[') { ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannable.setSpan(span, i, i + 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } }重新放到文本框里
mTv.setText(spannable);效果图
当然了,不仅可以给TextView设置,给EditText设置也是可以的!