EditText插入表情(字符串)到光标所在位置

获取EditText组件

[java] view plaincopy

  1. EditText etWeiboContent = (EditText) findViewById(R.id.et_content);

将表情转换成文本

[java] view plaincopy

  1. EmoticonsUtil mEmoticons = new EmoticonsUtil(this);
  2. CharSequence emoticonsText = mEmoticons.replace(mEmoticons.getEmoticons()[position]);

获取光标所在位置

[java] view plaincopy

  1. int index = etWeiboContent.getSelectionStart();

获取EditText中原有的文本内容

[java] view plaincopy

  1. Editable editable = etWeiboContent.getEditableText();

在光标所在位置插入表情转换成文本

[java] view plaincopy

  1. if (index < 0 || index >= editable.length()) {
  2. editable.append(emoticonsText);
  3. } else {
  4. editable.insert(index, emoticonsText);
  5. }

完整的代码如下:

[java] view plaincopy

  1. EditText etWeiboContent = (EditText) findViewById(R.id.et_content);
  2. // 将表情转换成文本
  3. EmoticonsUtil mEmoticons = new EmoticonsUtil(this);
  4. CharSequence emoticonsText = mEmoticons.replace(mEmoticons.getEmoticons()[position]);
  5. // 获取光标所在位置
  6. int index = etWeiboContent.getSelectionStart();
  7. // 获取EditText中原有的文本内容
  8. Editable editable = etWeiboContent.getEditableText();
  9. // 在光标所在位置插入表情转换成文本
  10. if (index < 0 || index >= editable.length()) {
  11. editable.append(emoticonsText);
  12. } else {
  13. editable.insert(index, emoticonsText);
  14. }

有关将表情转换成文本的工具类源码如下:

[java] view plaincopy

  1. package com.easipass.sysframe.sc.home;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6. import android.content.Context;
  7. import android.content.res.AssetManager;
  8. import android.graphics.Bitmap;
  9. import android.graphics.BitmapFactory;
  10. import android.text.Spannable;
  11. import android.text.SpannableStringBuilder;
  12. import android.text.style.ImageSpan;
  13. /**
  14. * 功能描述:文字与表情图标的处理工具类
  15. * @author android_ls
  16. */
  17. public class EmoticonsUtil {
  18. private AssetManager assetManager;
  19. private String[] emoticons;
  20. public AssetManager getAssetManager() {
  21. return assetManager;
  22. }
  23. public String[] getEmoticons() {
  24. return emoticons;
  25. }
  26. public EmoticonsUtil(Context context) {
  27. try {
  28. assetManager = context.getResources().getAssets();
  29. emoticons = assetManager.list("emoticons");
  30. // LogUtil.d("emoticons = " + emoticons.length);
  31. } catch (IOException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. }
  36. /**
  37. * 将文本中的表情符号替换为表情图片
  38. *
  39. * @param text
  40. *            需要转换的字符
  41. * @return 带有表情的字符
  42. */
  43. public CharSequence replace(String text) {
  44. // LogUtil.d("text = " + text);
  45. StringBuilder sb = new StringBuilder();
  46. sb.append(‘(‘);
  47. for (int i = 0; i < emoticons.length; i++) {
  48. sb.append(Pattern.quote(emoticons[i]));
  49. sb.append(‘|‘);
  50. }
  51. sb.replace(sb.length() - 1, sb.length(), ")");
  52. // LogUtil.d("sb = " + sb.toString());
  53. /* \Q    在non-word 字符前加上\,直到\E
  54. \E    结束\L,\E 和\Q*/
  55. // 竖线的转义:| ==> u007C
  56. // (\Qface001.png\E|\Qface002.png\E|\Qface003.png\E|\Qface004.png\E|\Qface005.png\E|\Qface006.png\E|\Qface007.png\E|\Qface008.png\E|\Qface009.png\E|\Qface011.png\E|\Qface012.png\E|\Qface016.png\E|\Qface018.png\E|\Qface019.png\E|\Qface020.png\E|\Qface025.png\E|\Qface026.png\E|\Qface032.png\E|\Qface036.png\E|\Qface037.png\E|\Qface040.png\E|\Qface054.png\E|\Qface055.png\E|\Qface058.png\E|\Qface059.png\E|\Qface060.png\E|\Qface061.png\E|\Qface062.png\E|\Qface063.png\E|\Qface071.png\E|\Qface072.png\E|\Qface073.png\E|\Qface081.png\E|\Qface083.png\E|\Qface085.png\E|\Qface090.png\E|\Qface098.png\E|\Qface099.png\E|\Qface100.png\E|\Qface101.png\E|\Qface102.png\E|\Qface103.png\E|\Qface104.png\E|\Qface105.png\E|\Qface106.png\E|\Qface114.png\E|\Qface121.png\E|\Qface191.png\E|\Qface194.png\E|\Qface196.png\E|\Qface198.png\E|\Qface201.png\E|\Qface202.png\E|\Qface205.png\E|\Qface208.png\E|\Qface217.png\E|\Qface218.png\E|\Qface219.png\E|\Qface220.png\E|\Qface221.png\E|\Qface222.png\E|\Qface223.png\E|\Qface224.png\E|\Qface225.png\E|\Qface226.png\E|\Qface227.png\E|\Qface228.png\E|\Qface229.png\E|\Qface231.png\E|\Qface233.png\E|\Qface234.png\E|\Qface238.png\E|\Qface239.png\E|\Qface242.png\E|\Qface247.png\E|\Qface248.png\E|\Qface251.png\E|\Qface252.png\E|\Qface253.png\E|\Qface254.png\E|\Qface255.png\E|\Qface257.png\E|\Qface258.png\E|\Qface259.png\E|\Qface260.png\E|\Qface261.png\E|\Qface263.png\E|\Qface264.png\E|\Qface265.png\E|\Qface266.png\E|\Qface268.png\E|\Qface270.png\E|\Qface271.png\E|\Qface273.png\E|\Qface274.png\E|\Qface277.png\E|\Qface278.png\E|\Qface279.png\E|\Qface280.png\E|\Qface281.png\E|\Qface285.png\E|\Qface287.png\E|\Qface288.png\E|\Qface290.png\E)
  57. // 利用 \Q \E 使得正则表示式里的特殊字符全部 文字化了
  58. Pattern pattern = Pattern.compile(sb.toString());
  59. try {
  60. SpannableStringBuilder builder = new SpannableStringBuilder(text);
  61. Matcher matcher = pattern.matcher(text);
  62. while (matcher.find()) {
  63. // 返回匹配到的子字符串
  64. // LogUtil.d("matcher.group() = " + matcher.group());
  65. InputStream inStream = assetManager.open("emoticons/" + matcher.group());
  66. Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(inStream), 60, 60, true);
  67. ImageSpan span = new ImageSpan(bitmap);
  68. // 返回匹配到的子字符串在字符串中的索引位置.
  69. // LogUtil.d("matcher.start() = " + matcher.start());
  70. // 返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
  71. // LogUtil.d("matcher.end() = " + matcher.end());
  72. builder.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  73. }
  74. return builder;
  75. } catch (Exception e) {
  76. return text;
  77. }
  78. /* 04-10 11:01:36.449: I/System.out(17881): text = face011.pngface016.pngface016.png
  79. 04-10 11:01:36.449: I/System.out(17881): sb = (\Qface001.png\E|\Qface002.png\E|\Qface003.png\E|\Qface004.png\E|\Qface005.png\E|\Qface006.png\E|\Qface007.png\E|\Qface008.png\E|\Qface009.png\E|\Qface011.png\E|\Qface012.png\E|\Qface016.png\E|\Qface018.png\E|\Qface019.png\E|\Qface020.png\E|\Qface025.png\E|\Qface026.png\E|\Qface032.png\E|\Qface036.png\E|\Qface037.png\E|\Qface040.png\E|\Qface054.png\E|\Qface055.png\E|\Qface058.png\E|\Qface059.png\E|\Qface060.png\E|\Qface061.png\E|\Qface062.png\E|\Qface063.png\E|\Qface071.png\E|\Qface072.png\E|\Qface073.png\E|\Qface081.png\E|\Qface083.png\E|\Qface085.png\E|\Qface090.png\E|\Qface098.png\E|\Qface099.png\E|\Qface100.png\E|\Qface101.png\E|\Qface102.png\E|\Qface103.png\E|\Qface104.png\E|\Qface105.png\E|\Qface106.png\E|\Qface114.png\E|\Qface121.png\E|\Qface191.png\E|\Qface194.png\E|\Qface196.png\E|\Qface198.png\E|\Qface201.png\E|\Qface202.png\E|\Qface205.png\E|\Qface208.png\E|\Qface217.png\E|\Qface218.png\E|\Qface219.png\E|\Qface220.png\E|\Qface221.png\E|\Qface222.png\E|\Qface223.png\E|\Qface224.png\E|\Qface225.png\E|\Qface226.png\E|\Qface227.png\E|\Qface228.png\E|\Qface229.png\E|\Qface231.png\E|\Qface233.png\E|\Qface234.png\E|\Qface238.png\E|\Qface239.png\E|\Qface242.png\E|\Qface247.png\E|\Qface248.png\E|\Qface251.png\E|\Qface252.png\E|\Qface253.png\E|\Qface254.png\E|\Qface255.png\E|\Qface257.png\E|\Qface258.png\E|\Qface259.png\E|\Qface260.png\E|\Qface261.png\E|\Qface263.png\E|\Qface264.png\E|\Qface265.png\E|\Qface266.png\E|\Qface268.png\E|\Qface270.png\E|\Qface271.png\E|\Qface273.png\E|\Qface274.png\E|\Qface277.png\E|\Qface278.png\E|\Qface279.png\E|\Qface280.png\E|\Qface281.png\E|\Qface285.png\E|\Qface287.png\E|\Qface288.png\E|\Qface290.png\E)
  80. 04-10 11:01:36.459: I/System.out(17881): matcher.group() = face011.png
  81. 04-10 11:01:36.469: I/System.out(17881): matcher.start() = 0
  82. 04-10 11:01:36.469: I/System.out(17881): matcher.end() = 11
  83. 04-10 11:01:36.469: I/System.out(17881): matcher.group() = face016.png
  84. 04-10 11:01:36.479: I/System.out(17881): matcher.start() = 11
  85. 04-10 11:01:36.479: I/System.out(17881): matcher.end() = 22
  86. 04-10 11:01:36.479: I/System.out(17881): matcher.group() = face016.png
  87. 04-10 11:01:36.489: I/System.out(17881): matcher.start() = 22
  88. 04-10 11:01:36.489: I/System.out(17881): matcher.end() = 33*/
  89. }
  90. }
时间: 2024-10-19 06:05:33

EditText插入表情(字符串)到光标所在位置的相关文章

android EditText插入字符串到光标所在位置

EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象 int index = mTextInput.getSelectionStart();//获取光标所在位置 String text="I want to input str"; Editable edit = mTextInput.getEditableText();//获取EditText的文字 if (index < 0 || index &

Android EditText插入表情(字符串)到光标位置

前言 之前写的一个Android应用,在回复帖子插入表情的时候存在一个BUG,就是无法在EditText中指定的光标处插入表情字符串,每次添加的表情字符串都跑到了文字末尾.分析了一下apk源码,发现是在表情盘的onClick响应事件中没有正确处理表情字符串的添加方法,这里记录一下如何在EditText指定光标处插入表情字符串. EditText光标处插入表情字符串的方法 既然是在EditText控件中插入表情字符串,那首先需要获取EditText控件对象,示例源码如下: EditText rEd

用js控制按钮时间,将指定内容添加到文本域的光标所在位置。

<pre class="javascript" name="code"> var fm = document.getElementsByTagName('form')[0]; var button = document.getElementsByName("button"); //获取一个cookie的值 function getCookie(index){ var allcookies = document.cookie; var

在EditText插入表情,并发送表情

在EditText插入表情,点击发送按钮,将qq表情显示在TextView中: [mw_shl_code=java,true]public class EditTextActivity extends Activity implements OnClickListener {private TextView showText, insetBtn;private EditText edit;private Button okBtn, backBtn;private myEditText medit

获取contenteditable区域光标所在位置信息

在我们使用contenteditable编辑时,有时需要光标位置的信息. <div contenteditable="true" style="min-height: 200px; width: 100%;-webkit-user-select: auto"></div> <script> if(s.anchorNode.parentElement.localName == 'div'){ actClass = s.anchorN

WPF RichTextBox 如何滚动到光标所在位置、滚动条操作

1.获取当前滚动条位置 //获取当前滚动条位置 richTextBox.VerticalOffset; richTextBox.HorizontalOffset; //获取当前光标位置 richTextBox.CaretPosition 2.滚动到开始,结束,指定位置 // // 摘要: // 将编辑控件的视图设置为内容的末尾. public void ScrollToEnd(); // // 摘要: // 将编辑控件的 " 视图到视区的开头. public void ScrollToHome(

往textarea中光标所在位置插入文本

来自于http://www.oschina.net/code/snippet_1780998_36843 $(".addFullIn").click( function () { $(".questionName").insertContent("( )"); }); //$(".addFullIn")为点击按钮 //$(".questionName")为要插入的文本框 //insertContent(&q

新浪微博客户端(47)-在TextView中插入表情

DJEmotionPageView.m // 发送点击广播(和android类似,区别在于android的广播是只要有上下文对象context,就可以发送) // iOS中的通知发送和接收都是通过NSNotificationCenter完成 NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; userInfo[DJEmotionDidSelctedEmotionKey] = btn.emotion; [[NSNoti

java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题

原因: 由于html转pdf时,不能自动换行,因此才有下面的代码. 注释:完全模拟html页面的自动换行! package test; import java.io.UnsupportedEncodingException; /** * 解决pdf换行问题,在指定位置插入指定字符串,兼容中英文以及特殊字符 * * @author xg君 * */ public class app { public static void main(String[] args) throws Unsupporte