效果图:

开始编码:

1、添加依赖

compile 'io.github.rockerhieu:emojicon:1.4.1'

2、布局文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:emojicon="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tvShow"android:layout_width="wrap_content"android:layout_height="wrap_content" /><io.github.rockerhieu.emojicon.EmojiconTextViewandroid:id="@+id/txtEmojicon"android:layout_width="match_parent"android:layout_height="0dp"android:layout_marginLeft="10dp"android:layout_marginTop="5dp"android:layout_weight="5"android:lineSpacingExtra="9dp"emojicon:emojiconAlignment="baseline"emojicon:emojiconSize="20sp" /><LinearLayoutandroid:id="@+id/ll_pl"android:layout_width="match_parent"android:layout_height="40dp"android:background="#ffffff"android:focusable="true"android:focusableInTouchMode="true"android:gravity="center_vertical"android:orientation="horizontal"android:paddingLeft="6dp"><io.github.rockerhieu.emojicon.EmojiconEditTextandroid:id="@+id/editEmojicon"android:layout_width="0dp"android:layout_height="30dp"android:layout_weight="5"android:background="@drawable/bg_input"android:hint="输入表情"android:lineSpacingExtra="9dp"android:paddingLeft="7dp"emojicon:emojiconSize="28sp" /><ImageViewandroid:id="@+id/imageView"android:layout_width="0.0dp"android:layout_height="30dp"android:layout_weight="1"android:src="@drawable/icon_sr_bq" /><Buttonandroid:id="@+id/bt_fs"style="?android:attr/buttonStyleSmall"android:layout_width="wrap_content"android:layout_height="30dp"android:layout_marginRight="8dp"android:background="#00ddcc"android:text="发送"android:textColor="#ffffff"android:textSize="14sp" /></LinearLayout><FrameLayoutandroid:id="@+id/emojicons"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="4.2"android:visibility="gone" />
</LinearLayout>

3、Activity代码:

public class EmojActivity extends AppCompatActivity implements View.OnClickListener, EmojiconGridFragment.OnEmojiconClickedListener, EmojiconsFragment.OnEmojiconBackspaceClickedListener {// EmojiconTextView继承自AppCompatTextView,而AppCompatTextView继承自TextViewprivate EmojiconEditText mEditEmojicon;private EmojiconTextView mTxtEmojicon;private TextView tvShow;private boolean hasClick;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_emoj);findViewById(R.id.imageView).setOnClickListener(this);findViewById(R.id.bt_fs).setOnClickListener(this);mEditEmojicon = (EmojiconEditText) findViewById(R.id.editEmojicon);mEditEmojicon.setOnClickListener(this);mTxtEmojicon = (EmojiconTextView) findViewById(R.id.txtEmojicon);tvShow = (TextView) findViewById(R.id.tvShow);setEmojiconFragment(false);}private void setEmojiconFragment(boolean useSystemDefault) {getSupportFragmentManager().beginTransaction().replace(R.id.emojicons, EmojiconsFragment.newInstance(useSystemDefault)).commit();}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.imageView: // 表情按钮if (hasClick) {findViewById(R.id.emojicons).setVisibility(View.GONE);} else {InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘findViewById(R.id.emojicons).setVisibility(View.VISIBLE);}hasClick = !hasClick;break;case R.id.bt_fs: // 发送按钮Toast.makeText(this, mTxtEmojicon.getText(), Toast.LENGTH_SHORT).show();tvShow.setText(mTxtEmojicon.getText() + "" + mEditEmojicon.getText());mTxtEmojicon.setText(mTxtEmojicon.getText() + "" + mEditEmojicon.getText());mEditEmojicon.setText("");break;case R.id.editEmojicon: // 输入框findViewById(R.id.emojicons).setVisibility(View.GONE);hasClick = !hasClick;break;}}@Overridepublic void onEmojiconClicked(Emojicon emojicon) {EmojiconsFragment.input(mEditEmojicon, emojicon);}@Overridepublic void onEmojiconBackspaceClicked(View v) {EmojiconsFragment.backspace(mEditEmojicon);}@Overridepublic void onBackPressed() {if(hasClick){findViewById(R.id.emojicons).setVisibility(View.GONE);hasClick = !hasClick;}else {super.onBackPressed();}}}

使用到的图片:

bg_input.png

icon_sr_bq.png

emojicon表情在服务器端数据库中的存取方法

参考博客: https://blog.csdn.net/Kodoo/article/details/48548833

问题描述

最近做一个Android项目,需要用到评论的功能,于是就需要emoji表情来让评论更加生动,于是在Github上找到了一个开源emoji表情库emojicon,效果如下。但是在使用过程中出现了问题,出现了表情存到数据库之后变为空白,所以取出后也是空白的问题。

问题原因

emoji分为 softbank emoji 和 unicode emoji,由于目前 softbank emoji 已停止更新,所以大多数 emoji 为 unicode emoji,emojicon 也是如此。unicode emoji 是四个字节长度,格式类似于 \uD83D 之类。由于项目和数据库都是UTF-8编码,UTF-8 是变长编码,可能是2-4个字节,而 MySQL 数据库的普通 UTF-8 编码只有三个字节,所以会出现无法解析的情况。

解决方案

大致有以下几种方法解决:

  • 更改数据库编码 (不推荐使用)
  • 转化为三个字节的 softbank emoji (不推荐使用)
  • 对 unicode 字符串进行加密解密 (推荐使用)

更改数据库编码

MySQL 版本 5.5.3 以上可以使用utf8mb4编码来进行存储,此编码支持4字节的 UTF-8 字符。但是这样做很可能会在其他地方出现不兼容的问题,且更改数据库编码对系统整体改动太大,不推荐使用。

转化为 三个字节的softbank emoji

如果要转化为 softbank emoji 的话,需要通过对照表将 unicode emoji 转化为 softbank emoji,工作量不小,而且新的表情并不支持,不推荐使用。

对unicode字符串进行加密解密

我采用了 Apache 的 commons-lang 包中的 StringEscapeUtils 类来对字符串进行加密解密:

//加密
mContent = StringEscapeUtils.escapeJava(emojiEditText.getText().toString());
//解密
mComment.setContent(StringEscapeUtils.unescapeJava(json.getJSONObject(i).getString("content")));

这样就可以在数据库中存储了,但是又出现了新问题,就是解密后的表情是 \uD83D 这样的 unicode 编码,而不是表情。
  查询数据库后发现,数据库中存储的字符串为 \uD83D 的样式,推测是对 \u 加了转义字符后,将转义字符也一起存储到数据库中了,因此解码后还是 \uD83D 这样的格式。因此,在解码之前,我们需要将 \uD83D 替换为 \uD83D ,即:

// 解密
mComment.setContent(StringEscapeUtils.unescapeJava(json.getJSONObject(i).getString("content").replace("\\\\u","\\u")));

至此,emojicon表情可以完美的存取了。

安卓项目实战之快速集成emojicon表情开源库相关推荐

  1. TorchSeg—基于PyTorch的快速模块化语义分割开源库

    点击我爱计算机视觉标星,更快获取CVML新技术 昨日,语义分割算法DFN.BiSeNet 第一作者ycszen开源了TorchSeg项目,基于PyTorch的快速模块化语义分割开源库,复现了DFN, ...

  2. ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记

    任务9:客户端集成IdentityServer 新建 API 项目 dotnet new webapi --name ClientCredentialApi 控制器添加验证 using Microso ...

  3. 安卓项目实战之强大的网络请求框架okGo使用详解(一):实现get,post基本网络请求,下载上传进度监听以及对Callback自定义的深入理解

    1.添加依赖 //必须使用 compile 'com.lzy.net:okgo:3.0.4'//以下三个选择添加,okrx和okrx2不能同时使用,一般选择添加最新的rx2支持即可 compile ' ...

  4. android安卓实现圆形头像效果(使用第三方开源库)

    实现圆形头像方法有很多,此处使用个人认为最为方便,以及最为快速的一种方法,使用第三方开源库.此开源库提供了一个第三方ImageView的控件:RoundedImageView. 实现步骤: 第一步:引 ...

  5. 开源项目推荐:3D点云处理开源库PCL/Cilantro/Open3d/Easy3D/PDAL/LAStools

    PCL Point Cloud Library是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取.滤波.分割.配准.检索 ...

  6. 从零到完成安卓项目实战【安卓端+后端】

    今天下雨了,出不去了,在家开发一个安卓系统. 因为平时自己喜欢打篮球,那就开发一个篮球相关的系统吧:NBA安卓系统. 一,功能介绍 APP主要具备网上篮球约球.篮球交流.线上NBA观赛,力求软件界面友 ...

  7. 项目实战之aiguibin-protal-gateway集成门户

    aiguibin-protal-gateway 前言 具体实现 vite+vue+js模板创建项目 清空src/components下的文件,修改App.vue文件 修改默认配置vite.config ...

  8. Python - - 项目实战 -- pygame 快速入门

    目标 1,项目准备 2,使用 pygame 创建图形窗口 3,理解 图像 并实现图像绘制 4,理解 游戏循环 和 游戏时钟 5,理解 精灵 和精灵组** 项目准备 1,新建 飞机大战 项目 2,新建一 ...

  9. iOS 【快速集成QQ表情键盘】

    Demo演示: 如果是UITextView,导入#import "UITextView+YZEmotion.h" 如果是UITextField,导入#import "UI ...

最新文章

  1. Jürgen Schmidhuber发文纪念10年前的研究,网友:转折点非AlexNet?
  2. Python入门(good)
  3. oracle 相同的sql执行两次 执行计划会不一样吗,一条SQL语句,两次执行计划的差距...
  4. #论文 《Towards Binary-Valued Gates for Robust LSTM Training》
  5. 综合评价模型的缺点_视频/图像质量评价综述(一)
  6. Android之滑动事件冲突解决 Touch事件处理机制总结
  7. 浙江省计算机二级aoa成绩,浙江省计算机二级AOAEXCEL函数列表
  8. python设计函数isleapyear_Python实战练习——打印日历教程
  9. python代码-在哪里编写python代码
  10. 随机森林和GBDT的几个核心问题
  11. unity 闪烁的gui button
  12. 车道线检测预处理(1)------ 融合白线黄线+高斯
  13. [BZOJ5276] Skyfall [CF235E] Number Challenge [莫比乌斯反演]
  14. 小松的STM32教程(2)—— OLED显示
  15. 眼睛中的密码-虹膜识别
  16. 是非人生 — 一个菜鸟程序员的5年职场路 第1节
  17. wordpress文章自动同步天涯博客插件wp2Tianya发布
  18. 吾生也有涯,吾知也无涯_乌拉(14)
  19. 如何卸载Onetastic
  20. 数据库回滚(rollback)和撤销(undo)的区别

热门文章

  1. sizeof(char str[])的大小、sizeof(char *str)
  2. DAM(Direct Memory Access)
  3. python requests 下载文件例子
  4. Ubuntu编译ijkplayer so库并播放本地raw/assets文件
  5. zz国外接活网站Elance, Freelancer和ScriptLance的介绍和对比
  6. 第八章 ESP32驱动LED灯
  7. 解决项目打成jar包上线无法读取配置文件(可通过挂载的方式解决)
  8. 计算机程序设计员技能试题,计算机程序设计员(基础知识程序设计员高级程序设计员程序设计师国家职业技能鉴定指导)...
  9. Java基础- 对象相等判断
  10. Pytorch里面多任务Loss是加起来还是分别backward?