获取EditText组件
- EditText etWeiboContent = (EditText) findViewById(R.id.et_content);
将表情转换成文本
- EmoticonsUtil mEmoticons = new EmoticonsUtil(this);
- CharSequence emoticonsText = mEmoticons.replace(mEmoticons.getEmoticons()[position]);
获取光标所在位置
- int index = etWeiboContent.getSelectionStart();
获取EditText中原有的文本内容
- Editable editable = etWeiboContent.getEditableText();
在光标所在位置插入表情转换成文本
- if (index < 0 || index >= editable.length()) {
- editable.append(emoticonsText);
- } else {
- editable.insert(index, emoticonsText);
- }
完整的代码如下:
- EditText etWeiboContent = (EditText) findViewById(R.id.et_content);
- // 将表情转换成文本
- EmoticonsUtil mEmoticons = new EmoticonsUtil(this);
- CharSequence emoticonsText = mEmoticons.replace(mEmoticons.getEmoticons()[position]);
- // 获取光标所在位置
- int index = etWeiboContent.getSelectionStart();
- // 获取EditText中原有的文本内容
- Editable editable = etWeiboContent.getEditableText();
- // 在光标所在位置插入表情转换成文本
- if (index < 0 || index >= editable.length()) {
- editable.append(emoticonsText);
- } else {
- editable.insert(index, emoticonsText);
- }
有关将表情转换成文本的工具类源码如下:
- package com.easipass.sysframe.sc.home;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import android.content.Context;
- import android.content.res.AssetManager;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.text.Spannable;
- import android.text.SpannableStringBuilder;
- import android.text.style.ImageSpan;
- /**
- * 功能描述:文字与表情图标的处理工具类
- * @author android_ls
- */
- public class EmoticonsUtil {
- private AssetManager assetManager;
- private String[] emoticons;
- public AssetManager getAssetManager() {
- return assetManager;
- }
- public String[] getEmoticons() {
- return emoticons;
- }
- public EmoticonsUtil(Context context) {
- try {
- assetManager = context.getResources().getAssets();
- emoticons = assetManager.list("emoticons");
- // LogUtil.d("emoticons = " + emoticons.length);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * 将文本中的表情符号替换为表情图片
- *
- * @param text
- * 需要转换的字符
- * @return 带有表情的字符
- */
- public CharSequence replace(String text) {
- // LogUtil.d("text = " + text);
- StringBuilder sb = new StringBuilder();
- sb.append('(');
- for (int i = 0; i < emoticons.length; i++) {
- sb.append(Pattern.quote(emoticons[i]));
- sb.append('|');
- }
- sb.replace(sb.length() - 1, sb.length(), ")");
- // LogUtil.d("sb = " + sb.toString());
- /* Q 在non-word 字符前加上,直到E
- E 结束L,E 和Q*/
- // 竖线的转义:| ==> u007C
- // (Qface001.pngE|Qface002.pngE|Qface003.pngE|Qface004.pngE|Qface005.pngE|Qface006.pngE|Qface007.pngE|Qface008.pngE|Qface009.pngE|Qface011.pngE|Qface012.pngE|Qface016.pngE|Qface018.pngE|Qface019.pngE|Qface020.pngE|Qface025.pngE|Qface026.pngE|Qface032.pngE|Qface036.pngE|Qface037.pngE|Qface040.pngE|Qface054.pngE|Qface055.pngE|Qface058.pngE|Qface059.pngE|Qface060.pngE|Qface061.pngE|Qface062.pngE|Qface063.pngE|Qface071.pngE|Qface072.pngE|Qface073.pngE|Qface081.pngE|Qface083.pngE|Qface085.pngE|Qface090.pngE|Qface098.pngE|Qface099.pngE|Qface100.pngE|Qface101.pngE|Qface102.pngE|Qface103.pngE|Qface104.pngE|Qface105.pngE|Qface106.pngE|Qface114.pngE|Qface121.pngE|Qface191.pngE|Qface194.pngE|Qface196.pngE|Qface198.pngE|Qface201.pngE|Qface202.pngE|Qface205.pngE|Qface208.pngE|Qface217.pngE|Qface218.pngE|Qface219.pngE|Qface220.pngE|Qface221.pngE|Qface222.pngE|Qface223.pngE|Qface224.pngE|Qface225.pngE|Qface226.pngE|Qface227.pngE|Qface228.pngE|Qface229.pngE|Qface231.pngE|Qface233.pngE|Qface234.pngE|Qface238.pngE|Qface239.pngE|Qface242.pngE|Qface247.pngE|Qface248.pngE|Qface251.pngE|Qface252.pngE|Qface253.pngE|Qface254.pngE|Qface255.pngE|Qface257.pngE|Qface258.pngE|Qface259.pngE|Qface260.pngE|Qface261.pngE|Qface263.pngE|Qface264.pngE|Qface265.pngE|Qface266.pngE|Qface268.pngE|Qface270.pngE|Qface271.pngE|Qface273.pngE|Qface274.pngE|Qface277.pngE|Qface278.pngE|Qface279.pngE|Qface280.pngE|Qface281.pngE|Qface285.pngE|Qface287.pngE|Qface288.pngE|Qface290.pngE)
- // 利用 Q E 使得正则表示式里的特殊字符全部 文字化了
- Pattern pattern = Pattern.compile(sb.toString());
- try {
- SpannableStringBuilder builder = new SpannableStringBuilder(text);
- Matcher matcher = pattern.matcher(text);
- while (matcher.find()) {
- // 返回匹配到的子字符串
- // LogUtil.d("matcher.group() = " + matcher.group());
- InputStream inStream = assetManager.open("emoticons/" + matcher.group());
- Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(inStream), 60, 60, true);
- ImageSpan span = new ImageSpan(bitmap);
- // 返回匹配到的子字符串在字符串中的索引位置.
- // LogUtil.d("matcher.start() = " + matcher.start());
- // 返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
- // LogUtil.d("matcher.end() = " + matcher.end());
- builder.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- return builder;
- } catch (Exception e) {
- return text;
- }
- /* 04-10 11:01:36.449: I/System.out(17881): text = face011.pngface016.pngface016.png
- 04-10 11:01:36.449: I/System.out(17881): sb = (Qface001.pngE|Qface002.pngE|Qface003.pngE|Qface004.pngE|Qface005.pngE|Qface006.pngE|Qface007.pngE|Qface008.pngE|Qface009.pngE|Qface011.pngE|Qface012.pngE|Qface016.pngE|Qface018.pngE|Qface019.pngE|Qface020.pngE|Qface025.pngE|Qface026.pngE|Qface032.pngE|Qface036.pngE|Qface037.pngE|Qface040.pngE|Qface054.pngE|Qface055.pngE|Qface058.pngE|Qface059.pngE|Qface060.pngE|Qface061.pngE|Qface062.pngE|Qface063.pngE|Qface071.pngE|Qface072.pngE|Qface073.pngE|Qface081.pngE|Qface083.pngE|Qface085.pngE|Qface090.pngE|Qface098.pngE|Qface099.pngE|Qface100.pngE|Qface101.pngE|Qface102.pngE|Qface103.pngE|Qface104.pngE|Qface105.pngE|Qface106.pngE|Qface114.pngE|Qface121.pngE|Qface191.pngE|Qface194.pngE|Qface196.pngE|Qface198.pngE|Qface201.pngE|Qface202.pngE|Qface205.pngE|Qface208.pngE|Qface217.pngE|Qface218.pngE|Qface219.pngE|Qface220.pngE|Qface221.pngE|Qface222.pngE|Qface223.pngE|Qface224.pngE|Qface225.pngE|Qface226.pngE|Qface227.pngE|Qface228.pngE|Qface229.pngE|Qface231.pngE|Qface233.pngE|Qface234.pngE|Qface238.pngE|Qface239.pngE|Qface242.pngE|Qface247.pngE|Qface248.pngE|Qface251.pngE|Qface252.pngE|Qface253.pngE|Qface254.pngE|Qface255.pngE|Qface257.pngE|Qface258.pngE|Qface259.pngE|Qface260.pngE|Qface261.pngE|Qface263.pngE|Qface264.pngE|Qface265.pngE|Qface266.pngE|Qface268.pngE|Qface270.pngE|Qface271.pngE|Qface273.pngE|Qface274.pngE|Qface277.pngE|Qface278.pngE|Qface279.pngE|Qface280.pngE|Qface281.pngE|Qface285.pngE|Qface287.pngE|Qface288.pngE|Qface290.pngE)
- 04-10 11:01:36.459: I/System.out(17881): matcher.group() = face011.png
- 04-10 11:01:36.469: I/System.out(17881): matcher.start() = 0
- 04-10 11:01:36.469: I/System.out(17881): matcher.end() = 11
- 04-10 11:01:36.469: I/System.out(17881): matcher.group() = face016.png
- 04-10 11:01:36.479: I/System.out(17881): matcher.start() = 11
- 04-10 11:01:36.479: I/System.out(17881): matcher.end() = 22
- 04-10 11:01:36.479: I/System.out(17881): matcher.group() = face016.png
- 04-10 11:01:36.489: I/System.out(17881): matcher.start() = 22
- 04-10 11:01:36.489: I/System.out(17881): matcher.end() = 33*/
- }
- }