Android中TextView图文并茂,可以同时放图片和文字(多用于聊天记录)

Android中TextView图文并茂,可以同时放图片和文字(多用于聊天记录)_第1张图片

这里提供一种不错的实现方法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);
效果图

Android中TextView图文并茂,可以同时放图片和文字(多用于聊天记录)_第2张图片


当然了,不仅可以给TextView设置,给EditText设置也是可以的!

你可能感兴趣的:(Android)