热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

获取EditText组件[java]viewplaincopyEditTextetWeiboContent(EditText)findViewById(R.id.et_conten

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

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

[java] view plaincopy
 
  1. package com.easipass.sysframe.sc.home;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.regex.Matcher;  
  6. import java.util.regex.Pattern;  
  7.   
  8. import android.content.Context;  
  9. import android.content.res.AssetManager;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.text.Spannable;  
  13. import android.text.SpannableStringBuilder;  
  14. import android.text.style.ImageSpan;  
  15.   
  16. /** 
  17.  * 功能描述:文字与表情图标的处理工具类 
  18.  * @author android_ls 
  19.  */  
  20. public class EmoticonsUtil {  
  21.   
  22.     private AssetManager assetManager;  
  23.   
  24.     private String[] emoticons;  
  25.   
  26.     public AssetManager getAssetManager() {  
  27.         return assetManager;  
  28.     }  
  29.   
  30.     public String[] getEmoticons() {  
  31.         return emoticons;  
  32.     }  
  33.       
  34.     public EmoticonsUtil(Context context) {  
  35.         try {  
  36.             assetManager = context.getResources().getAssets();  
  37.             emoticons = assetManager.list("emoticons");  
  38.             // LogUtil.d("emoticons = " + emoticons.length);  
  39.         } catch (IOException e) {  
  40.             // TODO Auto-generated catch block  
  41.             e.printStackTrace();  
  42.         }  
  43.     }  
  44.   
  45.     /** 
  46.      * 将文本中的表情符号替换为表情图片 
  47.      *  
  48.      * @param text 
  49.      *            需要转换的字符 
  50.      * @return 带有表情的字符 
  51.      */  
  52.     public CharSequence replace(String text) {  
  53.   
  54.         // LogUtil.d("text = " + text);  
  55.   
  56.         StringBuilder sb = new StringBuilder();  
  57.         sb.append(‘(‘);  
  58.   
  59.         for (int i = 0; i < emoticons.length; i++) {  
  60.             sb.append(Pattern.quote(emoticons[i]));  
  61.             sb.append(‘|‘);  
  62.         }  
  63.   
  64.         sb.replace(sb.length() - 1, sb.length(), ")");  
  65.         // LogUtil.d("sb = " + sb.toString());  
  66.   
  67.         /* \Q    在non-word 字符前加上\,直到\E 
  68.          \E    结束\L,\E 和\Q*/  
  69.         // 竖线的转义:| ==> u007C  
  70.   
  71.         // (\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)  
  72.   
  73.         // 利用 \Q \E 使得正则表示式里的特殊字符全部 文字化了   
  74.         Pattern pattern = Pattern.compile(sb.toString());  
  75.   
  76.         try {  
  77.             SpannableStringBuilder builder = new SpannableStringBuilder(text);  
  78.             Matcher matcher = pattern.matcher(text);  
  79.             while (matcher.find()) {  
  80.   
  81.                 // 返回匹配到的子字符串   
  82.                 // LogUtil.d("matcher.group() = " + matcher.group());  
  83.   
  84.                 InputStream inStream = assetManager.open("emoticons/" + matcher.group());  
  85.                 Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(inStream), 60, 60, true);  
  86.                 ImageSpan span = new ImageSpan(bitmap);  
  87.   
  88.                 // 返回匹配到的子字符串在字符串中的索引位置.  
  89.                 // LogUtil.d("matcher.start() = " + matcher.start());  
  90.                 // 返回匹配到的子字符串的最后一个字符在字符串中的索引位置.   
  91.                 // LogUtil.d("matcher.end() = " + matcher.end());  
  92.   
  93.                 builder.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  94.             }  
  95.             return builder;  
  96.         } catch (Exception e) {  
  97.             return text;  
  98.         }  
  99.   
  100.         /* 04-10 11:01:36.449: I/System.out(17881): text = face011.pngface016.pngface016.png 
  101.          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) 
  102.          04-10 11:01:36.459: I/System.out(17881): matcher.group() = face011.png 
  103.          04-10 11:01:36.469: I/System.out(17881): matcher.start() = 0 
  104.          04-10 11:01:36.469: I/System.out(17881): matcher.end() = 11 
  105.          04-10 11:01:36.469: I/System.out(17881): matcher.group() = face016.png 
  106.          04-10 11:01:36.479: I/System.out(17881): matcher.start() = 11 
  107.          04-10 11:01:36.479: I/System.out(17881): matcher.end() = 22 
  108.          04-10 11:01:36.479: I/System.out(17881): matcher.group() = face016.png 
  109.          04-10 11:01:36.489: I/System.out(17881): matcher.start() = 22 
  110.          04-10 11:01:36.489: I/System.out(17881): matcher.end() = 33*/  
  111.     }  
  112.   
  113. }  

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


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
houjiajun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有