广告
返回顶部
首页 > 资讯 > 移动开发 >Android编写简单的聊天室应用
  • 852
分享到

Android编写简单的聊天室应用

聊天室Android 2022-06-06 08:06:16 852人浏览 八月长安
摘要

最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能。主要技术点就是怎样把表情图片放到textview等Ui控件中展示。这里废话不多说,下面是效果图:  这

最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能。主要技术点就是怎样把表情图片放到textview等Ui控件中展示。这里废话不多说,下面是效果图:

 这里主要讲下怎样把文本替换到表情,先说下思路,首先我们的图片是保存在本地资源目录drawable中而所有的资源文件都是R这个类来管理,所以我们可以利用正则表达式找出图片id包装成ImageSpan然后把ImageSpan放到SpannableString中,最后把SpannableString放入edittext中,下面是源码


package com.coreAndroid.util; 
import java.lang.reflect.Field; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import android.content.Context; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.ImageSpan; 
import android.util.Log; 
import com.coreandroid.chart.R; 
public class ExpressionUtil { 
   
  public static void matchExpression(Context context, 
      SpannableString spannableString, Pattern patten, int start) 
      throws Exception { 
    Matcher matcher = patten.matcher(spannableString); 
    while (matcher.find()) { 
      String key = matcher.group(); 
      if (matcher.start() < start) { 
        continue; 
      } 
      Field field = R.drawable.class.getDeclaredField(key); 
      int resId = field.getInt(null); // 通过上面匹配得到的字符串来生成图片资源id 
      if (resId != 0) { 
        ImageSpan imageSpan = new ImageSpan(context, resId); // 通过图片资源id来得到bitmap,用一个ImageSpan来包装 
        int end = matcher.start() + key.length(); // 计算该图片名字的长度,也就是要替换的字符串的长度 
        spannableString.setSpan(imageSpan, matcher.start(), end, 
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 将该图片替换字符串中规定的位置中 
        if (end < spannableString.length()) { // 如果整个字符串还未验证完,则继续。。 
          matchExpression(context, spannableString, patten, end); 
        } 
        break; 
      } 
    } 
  } 
   
  public static SpannableString getExpressionString(Context context, 
      String str, String zhengze) { 
    SpannableString spannableString = new SpannableString(str); 
    Pattern sinaPatten = Pattern.compile(zhengze); // 通过传入的正则表达式来生成一个pattern 
    try { 
      matchExpression(context, spannableString, sinaPatten, 0); 
    } catch (Exception e) { 
      Log.e("dealExpression", e.getMessage()); 
    } 
    return spannableString; 
  } 
} 

下面是聊天记录列表的adapter,这里主要是动态的改变每个Item的布局来区分是自己还是他人的发言,具体源码如下:


package com.coreandroid.adapter; 
import java.text.DateFORMat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.List; 
import android.content.Context; 
import android.text.SpannableString; 
import android.text.TextUtils; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import com.coreandroid.chart.R; 
import com.coreandroid.entity.MessageInfo; 
import com.coreandroid.util.CommonUtils; 
import com.coreandroid.util.ExpressionUtil; 
public class ChartListAdapter extends BaseAdapter { 
  private Context context; 
  private LayoutInflater inflater; 
  private List<MessageInfo> data; 
  private DateFormat df; 
  public ChartListAdapter(Context context, List<MessageInfo> data) { 
    super(); 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
    this.data = data; 
    df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  } 
  @Override 
  public int getCount() { 
    return data.size(); 
  } 
  @Override 
  public Object getItem(int position) { 
    return data.get(position); 
  } 
  @Override 
  public long getItemId(int position) { 
    return position; 
  } 
  @Override 
  public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    if (convertView == null) { 
      convertView = inflater.inflate(R.layout.chart_list_item, null); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
    } else { 
      holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.setData((MessageInfo) getItem(position)); 
    return convertView; 
  } 
  private class ViewHolder { 
    private ImageView image; 
    private TextView text; 
    private TextView title; 
    private RelativeLayout rl; 
    public ViewHolder(View convertView) { 
      image = (ImageView) convertView 
          .findViewById(R.id.chart_list_item_headicon); 
      text = (TextView) convertView 
          .findViewById(R.id.chart_list_item_message); 
      title = (TextView) convertView 
          .findViewById(R.id.chart_list_item_title); 
      rl = (RelativeLayout) convertView 
          .findViewById(R.id.rl_chart_list_bottom); 
    } 
    public void setData(MessageInfo msg) { 
      RelativeLayout.LayoutParams rl_tv_msg_left = (RelativeLayout.LayoutParams) text 
          .getLayoutParams(); 
      RelativeLayout.LayoutParams rl_iv_headicon_left = (RelativeLayout.LayoutParams) image 
          .getLayoutParams(); 
      RelativeLayout.LayoutParams rl_tv_title = (RelativeLayout.LayoutParams) title 
          .getLayoutParams(); 
      RelativeLayout.LayoutParams rl_buttom = (RelativeLayout.LayoutParams) rl 
          .getLayoutParams(); 
      if (!CommonUtils.getDeviceId().equalsIgnoreCase(msg.getUserMac())) { 
        // 根据本地的mac地址来判断该条信息是属于本人所说还是对方所说 
        // 如果是自己说的,则显示在右边;如果是对方所说,则显示在左边 
        rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
        rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
        rl_tv_title.addRule(RelativeLayout.BELOW, 
            R.id.rl_chart_list_bottom); 
        rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
        rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        rl_tv_msg_left.addRule(RelativeLayout.RIGHT_OF, 
            R.id.chart_list_item_headicon); 
        text.setBackgroundResource(R.drawable.incoming); 
        String titleStr = msg.getUsermac() + "-" 
            + df.format(new Date()); 
        title.setText(titleStr); 
      } else { 
        rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
        rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
        rl_tv_title.addRule(RelativeLayout.BELOW, 
            R.id.rl_chart_list_bottom); 
        rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
        rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
        rl_tv_msg_left.addRule(RelativeLayout.LEFT_OF, 
            R.id.chart_list_item_headicon); 
        text.setBackgroundResource(R.drawable.outGoing); 
        String titleStr = df.format(new Date()) + "-" 
            + msg.getUsermac(); 
        title.setText(titleStr); 
      } 
      if (!TextUtils.isEmpty(msg.getHeadImage())) { 
        image.setImageBitmap(CommonUtils.strConvertBitmap(msg 
            .getHeadImage())); // 设置头像 
      } else { 
        image.setImageResource(R.drawable.im); 
      } 
      String str = msg.getMessage(); // 消息具体内容 
      try { 
        SpannableString spannableString = ExpressionUtil 
            .getExpressionString(context, str, CommonUtils.PATTERN); 
        text.setText(spannableString); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

源码下载:Android聊天室应用

您可能感兴趣的文章:Android实现C/S聊天室Android Socket通信实现简单聊天室Android使用websocket实现聊天室Android使用多线程进行网络聊天室通信android socket聊天室功能实现Android 基于Socket的聊天室实例Android中基于XMPP协议实现IM聊天程序与多人聊天室Android实现简单C/S聊天室应用


--结束END--

本文标题: Android编写简单的聊天室应用

本文链接: https://www.lsjlt.com/news/24902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android编写简单的聊天室应用
    最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能。主要技术点就是怎样把表情图片放到textview等Ui控件中展示。这里废话不多说,下面是效果图:  这...
    99+
    2022-06-06
    聊天室 Android
  • python简单的多人聊天室
    刚开始学习python,写了一个聊天室练练手。 Server.py import socket,select,thread; host=socket.gethostname() port=5963 addr=(host,port) ...
    99+
    2023-01-31
    聊天室 简单 python
  • 怎么用PHP实现简单的聊天室应用
    本篇内容介绍了“怎么用PHP实现简单的聊天室应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!介绍聊天应用程序在网上非常常见。开发人员在构建...
    99+
    2023-06-17
  • Java实现简单的聊天室功能
    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一、客户端的创建 1.我们可以用Socket来创建客户端 public class Client...
    99+
    2022-11-13
  • 怎么用SpringBoot+Netty实现简单聊天室
    本篇内容主要讲解“怎么用SpringBoot+Netty实现简单聊天室”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用SpringBoot+Netty实现简单聊天室”吧!一、实现1.User...
    99+
    2023-06-29
  • 怎么用AJAX实现简单的聊天室代码
    本篇内容主要讲解“怎么用AJAX实现简单的聊天室代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用AJAX实现简单的聊天室代码”吧! ...
    99+
    2022-10-19
  • C语言实现简单的聊天室功能
    用C语言实现简单的聊天室功能,供大家参考,具体内容如下 服务器端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...
    99+
    2022-11-12
  • SpringBoot+Netty实现简单聊天室的示例代码
    目录一、实现1.User类2.SocketSession类3.SessionGroup4.WebSocketTextHandler类5.WebSocketServer类6.index...
    99+
    2022-11-13
  • golang实现一个简单的websocket聊天室功能
    基本原理: 1.引入了 golang.org/x/net/websocket 包。 2.监听端口。 3.客户端连接时,发送结构体: {"type":"login","uid":"我是...
    99+
    2022-11-12
  • C++ select模型简单聊天室的实现示例
    TIPS:以下使用CMake项目进行开发。关于何为CMake,链接:https://www.jb51.net/article/247089.htm 简单聊天室效果展示 简单聊天室服...
    99+
    2022-11-13
  • 玩转NODE.JS(四)-搭建简单的聊天室的代码
    Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制。我便看了一些个教程使用它来搭建一个超级简单的聊天室。 初始化...
    99+
    2022-06-04
    玩转 聊天室 代码
  • c#基于WinForm的Socket实现简单的聊天室 IM
    目录1:什么是Socket2:客服端和服务端的通信简单流程3:服务端Code:4:客服端Code:5:测试效果:6:完整Code GitHUb下载路径 7:这个只是一个简单...
    99+
    2022-11-12
  • Java网络编程之简易聊天室的实现
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:运行客户端,连接服务器。 二、解题思路 首先需要启动上题的ServerSocketFrame服务,这样客户端运行时,才...
    99+
    2022-11-13
    Java实现简易聊天室 Java 聊天室
  • nodejs实现的一个简单聊天室功能分享
    今天我来实现一个简单的聊天室,后台用nodejs, 客户端与服务端通信用socket.io,这是一个比较成熟的websocket框架. 初始工作 1.安装express, 用这个来托管socket.io,以...
    99+
    2022-06-04
    聊天室 简单 功能
  • C++基于socket UDP网络编程实现简单聊天室功能
    本文实例为大家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供大家参考,具体内容如下 0.通信步骤流程图 (左:服务器;右:客户端;) 1.服务器代码 1.1服...
    99+
    2022-11-12
  • 如何利用C++实现一个简单的聊天室程序?
    如何利用C++实现一个简单的聊天室程序?在信息时代,人们越来越注重网络交流。而聊天室作为一种常见的沟通工具,具有实时性和交互性的特点,被广泛应用于各个领域。本文将介绍如何利用C++语言实现一个简单的聊天室程序。首先,我们需要建立一个基于客户...
    99+
    2023-11-04
    C++ 实现 聊天室程序
  • GO使用socket和channel实现简单控制台聊天室
    使用socket和channel,实现简单控制台聊天室 这里使用socket和channel,演示在GO中如何编写一个简单网络程序 功能分析 聊天室主要功能:用户可以加入/离开...
    99+
    2022-06-07
    Channel GO 聊天室 控制台 socket
  • 适用于Android开发的简单聊天软件
    适用于android 开发。是一个简单的聊天软件,包括知识点,各个控件的运用(ExpandableListView,ViewPager,Spinner,LinearLayout...
    99+
    2022-06-06
    android开发 软件 Android
  • Go语言怎么实现一个简单的并发聊天室
    今天小编给大家分享一下Go语言怎么实现一个简单的并发聊天室的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。并发聊天服务器这里主...
    99+
    2023-06-29
  • 编写简易Android天气应用的代码示例
    本文所要介绍的简易天气App主要用RxAndroid、MVP、Retrofit实现,首先来看看效果: 主页内容: 右侧栏天气列表: 左侧栏城市列表 首先看看Acti...
    99+
    2022-06-06
    示例 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作