聊天界面的制作(三)——表情列表发送功能

基本功能

1. 自定义标题栏。(标题栏不做任何功能)

2. 有左右发送按钮。(这个只能自己和自己聊天哦,所以有左右发送按钮)

  (1)点击左边按钮发送按钮,在ListView的左侧显示。
  (2)点击右边按钮发送按钮,在ListView的右侧显示。
  
3.有表情发送按钮。

  (1)当点击表情发送按钮时, 弹出表情框,点击想要发送的表情将其添加输入框中。
  (2)当在此点击表情按钮时,表情框收回。
  (3)当表情框处在显示状态时, 点击输入框时,表情框收回。

聊天界面的制作(一)——基本布局的实现
聊天界面的制作(二)——发送消息后ListView左右布局显示
源码下载链接

表情列表发送功能

1. 在总布局中添加一个GridView控件,用于显示表情列表。控件中设置一个android:visibility="gone"让其不显示且不占用空间。当点击表情按钮时才显示,也就是将其值在设置为”visible”;当在次点击时,不显示表情框,也就是又将其值设置为”gone”。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><include
        android:id="@+id/title_bar"layout="@layout/title_bar"android:layout_width="fill_parent"android:layout_height="wrap_content" /><ListView
        android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:background="@drawable/chatting_background"android:listSelector="@android:color/transparent"></ListView><LinearLayout
        android:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/grey"android:gravity="bottom"android:orientation="horizontal"><ImageButton
            android:id="@+id/imagebutton_expression"android:layout_width="40dp"android:layout_height="40dp"android:layout_margin="10dp"android:focusable="true"android:background="@drawable/imagebutton_expression" /><Button
            android:id="@+id/button_left"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_margin="5dp"android:background="@drawable/button_send_background"android:padding="5dp"android:text="发送"android:textColor="@color/white" /><EditText
            android:id="@+id/edittext_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dp"android:layout_weight="1"android:background="@drawable/edittext_background"android:padding="7dp"android:layout_gravity="center"/><Button
            android:id="@+id/button_right"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_margin="5dp"android:background="@drawable/button_send_background"android:padding="5dp"android:text="发送"android:textColor="@color/white" /></LinearLayout><GridView
        android:id="@+id/gridview"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="7"android:visibility="visible"android:background="@color/grey"></GridView></LinearLayout>

2. 首先定义一个布局,用于在GridView中的Item中显示每一个表情。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageView
        android:id="@+id/imageview_expression"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:src="@mipmap/dra" /></LinearLayout>

定义ExpressionAdapter将表情数据添加到布局中。

public class ExpressionAdapter extends BaseAdapter {//表情数据private int[] mExpression = {R.mipmap.dra,R.mipmap.drb,R.mipmap.drc,R.mipmap.drd,R.mipmap.dre,R.mipmap.drf,R.mipmap.drg,R.mipmap.drh,R.mipmap.dri,R.mipmap.drj,R.mipmap.drk,R.mipmap.drl,R.mipmap.drm,R.mipmap.drn,R.mipmap.dro,R.mipmap.drp,R.mipmap.drq,R.mipmap.drr,R.mipmap.drs,R.mipmap.drt,R.mipmap.dru,R.mipmap.drv,R.mipmap.drw,R.mipmap.drx,R.mipmap.dry,R.mipmap.drz,R.mipmap.dra};private LayoutInflater mInflater;public ExpressionAdapter(LayoutInflater mInflater) {this.mInflater = mInflater;}@Overridepublic int getCount() {return mExpression.length;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup viewGroup) {ViewHolder viewHolder = null;if(convertView == null){convertView = mInflater.inflate(R.layout.item_expression, null);viewHolder = new ViewHolder();viewHolder.imageview = (ImageView) convertView.findViewById(R.id.imageview_expression);convertView.setTag(viewHolder);}else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.imageview.setImageResource(mExpression[position]);return convertView;}class ViewHolder{ImageView imageview;}
}

3. 定义一个富文本,富文本中需要创建ImageGetter对象。然后通过Spanned对象ImageGetter对象返回的id来获得图片。

public class MainActivity extends Activity implements View.OnClickListener {private Button mButtonLeft;//左边发送按钮private Button mButtonRight;//右边发送按钮private EditText mEditTextInput;//输入框private ListView mListView;//显示消息的ListViewprivate GridView mGridView;//显示表情的GridViewprivate ImageButton mImageButtonExpression;//弹出和收回表情框的按钮private Spanned mSpanned;//富文本private Html.ImageGetter mImageGetter;//获得富文本图片private List<ChatMessage> mData;//消息数据private MessageAdapter mMessageAdapter;//消息适配器private ExpressionAdapter mExpressionAdapter;//表情适配器private InputMethodManager mInputMethodManager;//用于控制手机键盘的显示有否的对象(此处)//表情数据名称private String[] mExpression = {"dra", "drb", "drc", "drd", "dre", "drf","drg", "drh", "dri", "drg", "drk", "drl","drm", "drn", "dro", "drp", "drq", "drr","drs", "drt", "dru", "drv", "drw", "drx","dry", "drz", "dra"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mButtonLeft = (Button) findViewById(R.id.button_left);mButtonRight = (Button) findViewById(R.id.button_right);mEditTextInput = (EditText) findViewById(R.id.edittext_input);mImageButtonExpression = (ImageButton) findViewById(R.id.imagebutton_expression);mListView = (ListView) findViewById(R.id.listview);mGridView = (GridView) findViewById(R.id.gridview);mButtonLeft.setOnClickListener(this);mButtonRight.setOnClickListener(this);mImageButtonExpression.setOnClickListener(this);mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);//消息数据初始化mData = new ArrayList<ChatMessage>();//通过反射获得图片的idmImageGetter = new Html.ImageGetter() {@Overridepublic Drawable getDrawable(String s) {Drawable drawable = null;int id = R.mipmap.dra;if (s != null) {Class clazz = R.mipmap.class;try {Field field = clazz.getDeclaredField(s);id = field.getInt(s);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}drawable = getResources().getDrawable(id);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());return drawable;}};mExpressionAdapter = new ExpressionAdapter(getLayoutInflater());mGridView.setAdapter(mExpressionAdapter);//点击表情,将表情添加到输入框中。mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {//通过mImageGetter获得id获得表情图片,然后将其添加到输入框中。mSpanned = Html.fromHtml("<img src='" + mExpression[position] + "'/>", mImageGetter, null);mEditTextInput.getText().insert(mEditTextInput.getSelectionStart(), mSpanned);}});//点击输入框收回表情框mEditTextInput.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (mGridView.getVisibility() == View.VISIBLE) {mGridView.setVisibility(View.GONE);}}});}@Overridepublic void onClick(View view) {mMessageAdapter = new MessageAdapter(getLayoutInflater(), mData, mImageGetter);switch (view.getId()) {case R.id.imagebutton_expression://添加表情的按钮if (mGridView.getVisibility() == View.VISIBLE) {mGridView.setVisibility(View.GONE);} else {mGridView.setVisibility(View.VISIBLE);mInputMethodManager.hideSoftInputFromWindow(mEditTextInput.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);}break;case R.id.button_left://左边的发送按钮showListViewLeft();break;case R.id.button_right://右边的发送按钮showListViewRight();break;default:break;}}/*发送左边消息*/private void showListViewRight() {ChatMessage dataRight = new ChatMessage();dataRight.setTextViewTime(System.currentTimeMillis());dataRight.setTextViewHonour("营长");dataRight.setTextviewName("虫虫");/*判断发送的消息是否为空,如果为空则弹出提示不允许发送*/if (filterHtml(Html.toHtml(mEditTextInput.getText())).equals("")) {Toast.makeText(getApplicationContext(), "发送的消息不能为空!", Toast.LENGTH_SHORT).show();return;}dataRight.setTextViewInput(filterHtml(Html.toHtml(mEditTextInput.getText())));dataRight.setType(MessageAdapter.SEND_RIGHT);mMessageAdapter.notifyDataSetChanged();mData.add(dataRight);mListView.setAdapter(mMessageAdapter);mListView.setSelection(mData.size() - 1);mEditTextInput.setText("");}/*发送右边消息*/private void showListViewLeft() {ChatMessage dataLeft = new ChatMessage();dataLeft.setTextViewTime(System.currentTimeMillis());dataLeft.setTextViewHonour("营长");dataLeft.setTextviewName("虫虫");/*判断发送的消息是否为空,如果为空则弹出提示不允许发送*/if (filterHtml(Html.toHtml(mEditTextInput.getText())).equals("")) {Toast.makeText(getApplicationContext(), "发送的消息不能为空!", Toast.LENGTH_SHORT).show();return;}//将解析的数据添加到输入框中。dataLeft.setTextViewInput(filterHtml(Html.toHtml(mEditTextInput.getText())));dataLeft.setType(MessageAdapter.SEND_LEFT);mMessageAdapter.notifyDataSetChanged();mData.add(dataLeft);mListView.setAdapter(mMessageAdapter);mListView.setSelection(mData.size() - 1);mEditTextInput.setText("");}public String filterHtml(String str) {str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();return str;}
}

弹出收回表情框功能演示:
这里写图片描述

发送表情,在文本任意处插入表情功能演示:
这里写图片描述

聊天界面在点击表情按钮时会收回手机输入法键盘,在模拟器中无法演示,在此说明下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37109.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FindMeChat(盲盒社交)-匿名聊天-好玩有趣的社交平台

FindmeChat(盲盒社交)APP 重磅来袭! 全新玩法&#xff0c;遨游陌生社交元宇宙。 无聊急救包&#xff01;Findmechat(盲盒社交)&#xff01; 官网: http://www.findmechat.comhttp://www.findmechat.com 聊天网址(用手机浏览器打开哦): http://www.findmechat.nethttp://www…

虚拟人,数字人,虚拟数字人的定义区别

虚拟人 虚拟人&#xff08;Virtual Human&#xff09;&#xff0c;指通过数字技术模拟真实的人体器官而合成的三维模型。这种模型不仅具有人体外形以及肝脏、心脏、肾脏等各个器官的外貌&#xff0c;而且具备各器官的新陈代谢机能&#xff0c;能较为真实地显示出人体的正常生理…

AI 智能头像生成神器|PhotoShot

​ 题图&#xff1a;通过 PhotoShot 将普通图片生成智能头像 酱酱来为大家推荐好玩的开源软件啦 &#x1f973;&#xff01;&#xff01; 大家日常工作、生活中&#xff0c;经常会需要在一些网站、软件中自己的头像&#xff0c;但总会碰到一些问题&#xff0c;比如觉得照的不好…

借助免费AI艺术平台生成头像

随着 AI 的兴起&#xff0c;看到越来越多的实例通过 OpenAI 的举措变得轻松&#xff0c;使得 AI 艺术在今天早已不是什么新鲜事物&#xff0c;而且在游戏领域也开始有所应用。人工智能&#xff08;AI&#xff0c;artificial intelligence&#xff09;艺术&#xff0c;更准确地说…

【不存在的人】用Python获取生成随机头像,还不侵权

文章目录 ⛳️ 实战场景⛳️ 站点 1 实战编码⛳️ 站点 2 实战编码 ⛳️ 实战场景 在编写网站账号系统时&#xff0c;有时需要替新注册用户随机生成一个头像&#xff0c;有的站点使用色块拼接&#xff0c;有的网站使用随机汉字&#xff0c;今天我们使用一些随机头像站点&#…

征稿|IJCAI‘23大模型论坛,DeepMind EleutherAI Oxford主题报告

第一届LLMIJCAI’23 Symposium征稿中&#xff0c;优秀投稿论文推荐《AI Open》&#xff08;EI检索&#xff09;和 《JCST》(CCF-B)发表。 大规模语言模型&#xff08;LLMs&#xff09;&#xff0c;如ChatGPT和GPT-4&#xff0c;以其在自然语言理解和生成方面的卓越能力&#xf…

计算机毕设Python+Vue学生社团管理(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何做一个基于微信评选投票小程序系统毕业设计毕设作品

分析架构 我们开发系统&#xff0c;常规有两个架构&#xff0c;一个BS架构&#xff08;浏览器/服务器模式&#xff09;&#xff0c;一个CS&#xff08;客户端/服务器端模式&#xff09;&#xff1b;我们微信小程序项目属于CS架构&#xff0c;C客户端是我们要开发的小程序&…

计算机毕设Python+Vue学生实验报告管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

大数据毕设 - 校园卡数据分析与可视化(python 大数据)

文章目录 0 前言1 课题介绍2 数据预处理2.1 数据清洗2.2 数据规约 3 模型建立和分析3.1 不同专业、性别的学生与消费能力的关系3.2 消费时间的特征分析 4 Web系统效果展示5 最后 0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff…

大学生毕设小demo(后台管理系统)

大学生毕设小demo 介绍 使用java和react和mongoDBmySQLredis搭建的一个大学生模板管理系统&#xff0c;功能丰富 可查看线上部署地址点击链接体验功能 一、相关功能&#xff08;都是同步数据库的) 1.数据的基本增删查改 2.用户的登录判断(含token60s有效验证码)&#xff0…

文件名、目录名或卷标语法不正确;AttributeError: module ‘numpy‘ has no attribute ‘long‘;shell脚本:Syntax error: Bad for

1、文件名、目录名或卷标语法不正确; 根据您提供的代码片段&#xff0c;错误出现在makedirs()函数的调用中。这个函数用于创建多层次的目录。 根据代码片段&#xff0c;makedirs()函数的调用是在以下条件满足时发生的&#xff1a; head和tail都不为空。head所代表的路径不存…

大模型-DeltaTuning:①增量式(原模型参数不变,插入可微调参数层)、②指定式(原模型参数冻结一部分参数,微调一部分参数)、③重参数化式(将原模型参数层改造,比如插入低秩)

【随着模型增大,各方案区别不大】 统一框架: 《Towards a Unified View of Parameter-Efficient Transfer Learning》 GitHub - thunlp/PromptPapers: Must-read papers on prompt-based tuning for pre-trained language models. GitHub - thunlp/DeltaPapers: M

大模型微调技术(Adapter-Tuning、Prefix-Tuning、Prompt-Tuning(P-Tuning)、P-Tuning v2、LoRA)

2022年11月30日&#xff0c;ChatGPT发布至今&#xff0c;国内外不断涌现出了不少大模型&#xff0c;呈现“百模大战”的景象&#xff0c;比如ChatGLM-6B、LLAMA、Alpaca等模型及在此模型基础上进一步开发的特定领域的大模型。今年3月15日&#xff0c;GPT-4发布后&#xff0c;也…

FP独立站卖家怎么解决收款问题?挑选支付公司有何关注点?

2023年是充满希望又充满挑战的一年。这一年&#xff0c;新冠肺炎疫情恢复&#xff0c;经济慢慢复苏&#xff0c;对做跨境电商的卖家来说是个不错的机遇&#xff1b;但由于chatgpt人工智能的出现&#xff0c;F牌网站被检测出来的几率大大提高……让F牌独立站卖家最头疼的是&…

2023年8大公司数据泄露事件

数据安全一直是社会关注的热点问题&#xff0c;数据泄露事件的披露始终占据媒体的头条榜首。随着大数据、互联网、5G的迅速发展&#xff0c;为人类带来无限发展机遇的同时&#xff0c;也催生了大量的信息泄露事件。 当发生数据泄露事件时&#xff0c;他们攻破企业网络防线&…

AI浪潮下,企业如何保障数据安全,不泄露

随着数字经济蓬勃发展&#xff0c;数据对于企业的价值与重要性不断攀升&#xff0c;随之而来的数据安全风险也不断涌现。再加上ChatGPT诞生&#xff0c;推动ai算力技术大步跃进&#xff0c;而算力提升的背后是史诗量级规模的数据投入&#xff0c;数据量越大&#xff0c;用户数据…

奇瑞汽车回应要求员工周六上班:本意不是压榨员工;Google发布史上最大通才模型PaLM-E;Chrome 111发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

杭州一公司开20万月薪抢AIGC算法工程师;SpaceX「星舰」发射任务失败;华为宣布实现ERP自主可控,突破封锁|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

小心你的 OpenAI Key 被盗!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 今年随着 ChatGPT 发布&#xff0c;其强悍的能力也让 GPT-3.5/4 成为炙手可热的大语言模型&#xff0c;使得不少 AI 应用接入了 OpenAI 接口。当用户使用这些应用时&#xff0c;经常需要填…