编写精美的聊天界面(左边显示接收消息,右边显示发送消息)(项目已上传GitHub)

Android-一个实现了聊天界面的Android库 一个实现了聊天界面的Android库 立即下载

附上我的GitHub项目地址:

https://github.com/Skymqq/UIChat.git

 

学习Android开发,了解一个精美聊天界面的实现是很有必要的,如果可以掌握这个技能,那么在下次接触聊天项目的时候,UI这方面你就有了些基础经验了,加油哟。

首先创建一个UIChat项目。

在实战开始之前,我们还需要学习一下如何制作Nine-Patch图片。你可能之前还没有听说过这个名词,它是一种被特殊处理过的png图片,能够指定哪些区域可以被拉伸、哪些区域不可以。

那么Nine-Path图片到底有什么实际作用呢?我们还是通过一个例子来看一下吧。比如项目中有一张气泡样式的图片chat.png,如图所示:

我们将这张图片设置为LinearLayout的背景图片,修改activity_main.xml中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@mipmap/chat">

</LinearLayout>

效果图:

我们看到,这个图像被拉伸的很扭曲,非常难看。这个时候Nine-Patch图片就可以用来改善程序的适配了。

这里我们只需要在资源目录中找到图片,并且右击,选择Create 9-Patch file...  然后下一步,就生成了一个chat.9.png的图片,我们打开它,并且将鼠标移动到灰色边框旁边,分别在4个方向上拖动鼠标,绘制出4个小黑边,小黑边就是允许拉伸的区域,具体步骤请看图解:

 

 

这个时候有了两张png图片,将chat.png图片删除,我们就可以看到图像已经适配了,至于为何background还是冒红色,这个我就不太清楚了,至少我运行是没有问题的

预览界面:

运行效果图:

这样当图片需要拉伸的时候,就可以只拉伸指定的区域,程序在外观上也有了很大的改进,有了这个知识储备之后,我们就可以进入实战的环节了。

既然是要编写一个聊天界面,那就肯定要有收到的消息和发出的消息。上面我们制作的chat.9.png可以作为收到消息的背景图,这里为了区分左右,我们将chat.9.png改名为chat_left.9.png(改名的快捷键是shift+F6),接下来我们再像之前制作Nine-Patch图片一样,再制作一张chat_right.9.png图片作为右边发送消息的背景图。

两张背景图准备就绪之后,我们就可以正式编码了。由于我们等下会使用到RecyclerView控件,所以,我们需要在app/build.gradle当中添加依赖库,如下所示:

implementation 'com.android.support:recyclerview-v7:28.0.0'

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#d8e0e8"
    android:orientation="vertical">

    <!--RecyclerView列表-->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <!--EditText输入消息内容-->
        <EditText
            android:id="@+id/et_msg"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Type something here"
            android:maxLines="2" />

        <!--Button发送消息-->
        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="send"
            android:textAllCaps="false" />
    </LinearLayout>

</LinearLayout>

预览界面:

 

我们在主界面中放置了一个RecyclerView用于显示聊天的消息内容,又放置了一个EditText用于输入消息,还放置了一个Button用于发送消息。

然后定义一个消息的实体类,新建Msg类,代码如下所示:

package com.example.administrator.uichat;

public class Msg {

    public static final int TYPE_RECEIVED = 0;//静态常量,用于表示消息类型为接收状态

    public static final int TYPE_SEND = 1;//静态常量,用于表示消息类型为发送状态

    private String content;//消息内容

    private int type;//消息类型

    public Msg(String content, int type) {
        this.content = content;
        this.type = type;
    }

    public String getContent() {
        return content;
    }

    public int getType() {
        return type;
    }
}

Msg类中只有两个字段,content表示消息的内容,type表示消息的类型。其中消息类型有两个值可以选择,TYPE_RECEIVED表示这是一条收到的消息,TYPE_SEND表示这是一条发出的消息。

接下来编写,RecyclerView子项的布局,新建msg_item.xml,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <!--左边,收到消息布局-->
    <LinearLayout
        android:id="@+id/linearLayout_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:background="@mipmap/chat_left">

        <!--显示文字设置-->
        <TextView
            android:id="@+id/tv_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:textColor="#fff"
            android:textSize="15sp"
            android:textStyle="bold" />
    </LinearLayout>

    <!--右边,发送消息布局-->
    <LinearLayout
        android:id="@+id/linearLayout_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:background="@mipmap/chat_right">

        <!--显示文字设置-->
        <TextView
            android:id="@+id/tv_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:textColor="#000"
            android:textSize="15sp"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>

预览界面:

这里我们让收到的消息居左对齐,发出的消息居右对齐,并且分别使用chat_left.9.png和chat_right.9.png作为背景图。你可能会有些疑虑,怎么能让收到的消息和发出的消息都放在同一个布局里呢?不用担心,还记得我们之前学习过的可见属性吗?只要稍后在代码中根据消息的类型来决定隐藏和显示哪种消息就可以了。

接下来需要创建RecyclerView的适配器类,新建类MsgAdapter,代码如下所示:

package com.example.administrator.uichat;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {

    private List<Msg> msgList;

    public MsgAdapter(List<Msg> msgList) {
        this.msgList = msgList;
    }


    static class ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout leftLayout;

        LinearLayout rightLayout;

        TextView leftMsg;

        TextView rightMsg;

        public ViewHolder(View view) {
            super(view);
            leftLayout = (LinearLayout) view.findViewById(R.id.linearLayout_left);
            rightLayout = (LinearLayout) view.findViewById(R.id.linearLayout_right);
            leftMsg = (TextView) view.findViewById(R.id.tv_left);
            rightMsg = (TextView) view.findViewById(R.id.tv_right);
        }

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.msg_item, viewGroup, false);//加载子项布局
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        Msg msg = msgList.get(i);//获取List列表中的Msg实例
        if (msg.getType() == Msg.TYPE_RECEIVED) {
            //如果是收到的消息,则显示左边的消息布局,将右边的消息布局隐藏
            viewHolder.leftLayout.setVisibility(View.VISIBLE);//显示左边消息布局
            viewHolder.rightLayout.setVisibility(View.GONE);//隐藏右边消息布局,并且不占屏幕空间
            viewHolder.leftMsg.setText("" + msg.getContent());//将消息内容显示
        } else if (msg.getType() == Msg.TYPE_SEND) {
            //如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏
            viewHolder.rightLayout.setVisibility(View.VISIBLE);//显示右边消息布局
            viewHolder.leftLayout.setVisibility(View.GONE);//隐藏左边消息布局
            viewHolder.rightMsg.setText("" + msg.getContent());//将消息内容显示
        }
    }

    @Override
    public int getItemCount() {
        return msgList.size();
    }


}

这段代码比较简单,我也都基本上给了注释,分析就略过了。

最后修改MainActivity.java代码,来为RecyclerView初始化一些数据,并给发送按钮加入事件响应,代码如下所示:

package com.example.administrator.uichat;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Msg> msgList = new ArrayList<>();

    private EditText et_msg;

    private Button btn_send;

    private RecyclerView recyclerView;

    private MsgAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
        initData();//初始化数据
    }


    private void initView() {
        et_msg = (EditText) findViewById(R.id.et_msg);
        btn_send = (Button) findViewById(R.id.btn_send);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

    }

    private void initData() {
        initMsg();//初始化消息
        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new MsgAdapter(msgList);
        recyclerView.setAdapter(adapter);
    }

    private void initMsg() {
        Msg msg1 = new Msg("Hello guy", Msg.TYPE_RECEIVED);
        msgList.add(msg1);
        Msg msg2 = new Msg("Hello Who is that?", Msg.TYPE_SEND);
        msgList.add(msg2);
        Msg msg3 = new Msg("This is Tom. Nice talking to you. ", Msg.TYPE_RECEIVED);
        msgList.add(msg3);
    }

    @Override
    protected void onResume() {
        super.onResume();
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String content = et_msg.getText().toString();
                if (!"".equals(content)) {
                    Msg msg = new Msg(content, Msg.TYPE_SEND);
                    msgList.add(msg);
                    adapter.notifyItemInserted(msgList.size() - 1);//当有消息时,刷新RecyclerView中的显示
                    recyclerView.scrollToPosition(msgList.size() - 1);//将RecyclerView定位到最后一行
                    et_msg.setText("");//清空输入框中的内容
                }
            }
        });
    }

}

其实看起来代码量一点不多,我们具体划分一下步骤,你可能就觉得实现思路贼easy了。

步骤1:声名控件、声名并初始化List<Msg>类型的集合,声名适配器

步骤2:初始化控件

步骤3:初始化数据,这其中又可划分为:1初始化消息,就是先自定义3个Msg实例放入List集合中,这就是运行程序时先显示的3个消息的内容,2初始化适配器,3为RecyclerView控件设置LinearLayoutMannager(线性布局管理器,默认是垂直方向显示的),为RecyclerView设置适配器。

步骤4:为Button按钮设置点击监听,先判断EdtiText中的内容是否为空,只有在EditText中的内容非空的时候,我们才能将消息内容和消息类型设置好,然后将消息实例放入List集合中,再将List集合作为参数传入适配器中,最后刷新适配器,并且将消息定位到RecyclerView的最后一行,同时清除EditText控件中的内容。

 

如果你们可以根据代码,可以很清晰地明白实现思路,其实没必要看我的分析,我都感觉自己说的有点聒噪了...

毕竟,看代码,有自己独特的见解才是最好的。

最终效果图:

 

NXP(imx8qxp)系列DDR校准以及android镜像烧录 文章目录一、 不得不吐槽以下nxp的这个代码镜像烧写的过程,做得太开源了,导致镜像根本烧录不进去,实属令人头痛。 一、 阅读详情

相关推荐

量化爬虫实战:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向思路与Cookie Hook技巧)

本文详细解析了如何通过JS逆向技术获取同花顺问财平台的`hexin-v`参数,包括Cookie Hook技巧和完整解决方案架构。从环境搭建到参数定位,再到生成逻辑逆向,手把手教你突破数据获取限制,为量化交易提供可靠数据支持。

weixin_42557803的博客 398

Android 客服聊天简单实现

目前第三方的客服系统基本都开始收费了,但有些APP又离不开客服功能,就只能自己实现了,上一篇文章《Android WebSocket 简单使用》就是为了实现客服功能做的准备,这里简单记录一下客服功能的实现。 一、主要功能 1、实现WebSocket通信保持长链接 2、能够发送文字、图片、商品等信息 3、显示消息发送时间、提示信息等 4、本地存储历史消息(Room实现本地数据库) 二、功能实现 基本功能的实现大多在代码中进行注释,就不过多介绍了。 1、主页面布局 <?xml vers

小旭的专栏 4750

ZYNQ程序固化实战:从BOOT.bin生成到QSPI/SD卡双启动模式详解

本文详细解析了ZYNQ 7000系列程序固化的完整流程,重点解决了程序断电丢失问题。通过实战演示,从生成BOOT.bin文件到配置QSPI与SD卡双启动模式,逐步指导开发者实现程序在外部存储中的永久驻留,确保产品脱离调试器独立运行。

weixin_29193259的博客 516

CSS day12 移动端布局练习

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-U...

qq_34620296的博客 1036

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

5V转±12V无变压器双boost电路

最近有个新项目,需要±10V范围的模拟量输出(非隔离),对于5V以下供电的控制板而言单端输出绝对没问题,可现在需要有正负输出,是少不了正负电源的,因此准备设计一个5V转±12V的电源,然后选择一个双向供电的运放,来实现单端模拟量信号向双向模拟量信号转换。 本文就来分享一下5V转±12V电源的设计。对于有类似双向电源需求的场合,大多使用变压器通过增加多个绕组来实现,而对于体积空间有要求的场合来讲,变压器实在是太大了,另外对于一些成熟的项目,变压器如果是已经设计好的,再额外增加绕组需要重新设计,费时费力。于是,

qq_30388337的博客 1万+

React AntDesign 聊天机器人 阿里ChatUI使用

使用阿里的antDesignPro开发了前端项目,现在根据需求进行了客户对话框的开发,找了三个组件。 https://blog.youkuaiyun.com/yehuozhili/article/details/108552890 https://fredrikoseberg.github.io/react-chatbot-kit-docs/#tutorials 最后发现阿里开源的ChatUI组件好看,有“比较”前的组件文档。所以就开始根据ChatUI开发。当然以上才材料也有很多借鉴的地方,三个组件可以根据需求自

runrun117的博客 9848

手把手教你打造CTF动态靶场

公司想搞一个CTF比赛,需要一个竞赛靶场,于是这个任务就落在了我的身上,平台是利用CTFd框架,基于docker搭建的动态靶场,搭建过程中遇到的坑比较多,这里我会把每一个遇到的坑都指出来。我搭建的是CTFd的3.X的版本。第一次搭建的话,搭建的过程会有些痛苦,但是搭建完成后会越来越熟练,这个平台的可用性还是很高的。由于搭建的过程中遇到的坑太多了,各种各样的问题,所以决定写下这篇文章,把所有的坑都指出来,也算为后边想搭这个平台的小伙伴指一条路。Taps:资源来源:星海安全实验室如果你也对网络安全&黑客。

Python栈 4933

【2023最新】超详细图文保姆级教程:App开发新手入门(6)

2023年最详细的保姆级App开发快速入门系列教程(6),面向初级新手同学,通过使用YonBuilder移动开发技术,可以让开发同学仅用Web前端技术(HTML、CSS、JavaScript),就可以完成Android 和 iOS App客户端的开发。

开发的那些事儿 927

Android14到Android16源码移植中的Bluetooth模块规范适配指南

本文详细解析了从Android14到Android16源码移植过程中Bluetooth模块的规范适配挑战,重点介绍了Android.bp配置差异及常见编译报错解决方案。针对代码规范检查、final字段声明、静态方法优化等核心问题提供实用修复方法,帮助开发者高效完成版本升级适配工作。

fire9的博客 254

对MixPad精灵(触屏语音开关)进行解剖分析

概述 最近有点忙,已经很久没有更新文章了,对不起各位网友啦~ 这次对ORVIBO的新产品:MixPad精灵款的来个剖析,希望对大家有所帮助! 首先,我买了一台对应的设备,直接去官网采购,价格吗还算OK,400多的价格。 拆箱的过程我就不写了,简单的上个图就行了。 一、拆包: 主屏板包装盒(顶部): 主屏板包装盒(底部): 后盖电源部分无内容,我就不拍了,给优快云空间省点存储位置。 二、设备剖析开始 接下来,我们开始对设备进行剖析,步骤如下: 1、拆掉主屏板后盖板,...

LeeKwen的专栏 3941

如何永久保存微信聊天记录:免费开源工具WeChatMsg完整指南

你是否曾因为更换手机而丢失珍贵的微信对话?那些与家人朋友的温馨交流、工作中的重要讨论、生活中的美好瞬间,是否只能在记忆中逐渐模糊?今天我要为你介绍一款完全免费的微信聊天记录导出工具——**WeChatMsg**,它能让你轻松备份、分析和永久保存每一段对话。 ## 💔 为什么你的聊天记录值得被珍藏? 在数字时代,微信聊天记录已经不仅仅是简单的文字交流,它们承载着: - **情感记忆的载体**

gitblog_01188的博客 1088

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3542

如何永久保存微信聊天记录:简单实用的完整指南与年度报告生成

你是否曾经因为手机更换或系统升级而丢失了珍贵的微信聊天记录?那些与家人朋友的温馨对话、重要的工作讨论、美好的回忆瞬间,是否都随着时间流逝而消失?现在,通过WeChatMsg微信消息管理工具,你可以轻松实现微信聊天记录永久保存,将零散的对话转化为结构化数据,甚至生成精美的年度聊天报告。 ## 📱 你的数字记忆,值得被永久珍藏 微信聊天记录不仅仅是一堆文字和图片,它们承载着我们的生活轨迹、情感交

gitblog_01135的博客 852

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LobeChat为何成为GitHub热门项目?核心优势全面剖析

LobeChat凭借开源、模块化架构和易部署特性,填补了大模型与落地应用间的鸿沟。支持多模型接入、插件扩展与本地化部署,满足企业对数据安全与定制化的需求,成为构建AI聊天界面的首选框架。

weixin_35757191的博客 786

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何永久保存微信聊天记录?这款开源工具让你轻松导出并生成年度报告

你是否曾担心重要的微信对话会随着时间流逝而消失?那些深夜的谈心、工作的重要约定、节日的温馨祝福,都隐藏在微信对话框里。WeChatMsg为你提供了一个完美的解决方案——这是一款开源工具,能够将微信聊天记录完整导出为HTML、Word、CSV等多种格式永久保存,更重要的是,它还能对聊天记录进行深度分析,生成精美的年度聊天报告,让你的每一段对话都成为永恒的数字记忆。 ## 为什么你的微信聊天记录需要

gitblog_00466的博客 900

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何永久保存你的微信聊天记忆?这个免费工具让数据真正属于你

你是否曾经因为手机更换、系统升级或误操作,眼睁睁看着珍贵的微信聊天记录消失不见?那些与家人的温馨对话、朋友的重要约定、同事的工作沟通,都值得被永久珍藏。今天,我要向你介绍一个完全免费的开源工具——WeChatMsg,它能将你的微信聊天记录提取并永久保存为多种格式,还能生成精美的年度分析报告,让你真正掌握自己的数字记忆。 ## 🎯 为什么你的聊天记录需要专业备份? 在数字时代,聊天记录不仅仅是

gitblog_00154的博客 862

如何永久保存微信聊天记录?开源工具WeChatMsg完整解决方案

你是否曾因为手机更换或系统升级而丢失珍贵的微信聊天记录?那些与亲友的温馨对话、工作中的重要沟通、生活中的点滴回忆,都值得被永久珍藏。今天,我将为你介绍一款完全免费的开源工具**WeChatMsg**,它能够将你的微信聊天记录安全地导出为多种格式,并生成专业的年度数据分析报告。这款微信聊天记录永久保存工具采用本地化处理方式,确保你的数据隐私安全,让你真正成为自己数字记忆的主人。 ## 🔍 为什么

gitblog_00562的博客 884

3步永久保存微信聊天记录:WeChatMsg开源工具完全指南

你是否担心更换手机时丢失珍贵的微信聊天记录?那些与家人朋友的温馨对话、重要的工作沟通、难忘的生活瞬间,一旦消失就无法找回。WeChatMsg是一款完全免费的开源工具,专门解决微信聊天记录备份难题,让你能够将聊天记录永久保存为HTML、Word、CSV等多种格式,还能生成精美的年度数据分析报告,真正掌控自己的数字记忆。 ## 🚨 你的聊天记录面临哪些风险? 在数字时代,我们的聊天记录承载着太多

gitblog_00202的博客 440

告别聊天记录丢失:如何用WeChatMsg提取微信聊天记录并生成年度报告

你有没有过这样的瞬间:换了手机,打开微信,和重要的人几百个对话框瞬间归零,那些深夜长谈、工作对接、家人的叮嘱,再也翻不回来了。WeChatMsg是一款能帮你提取微信聊天记录的开源工具,支持导出成HTML、Word、CSV文档永久保存,还能自动生成专属的年度聊天报告。 我有个朋友为此懊恼了很久。毕业三年后,他想翻出大学时室友群里的对话,旧手机却早就开不了机。后来他试了WeChatMsg,把四年的聊

gitblog_00709的博客 664

一键导出3种格式:如何永久保存你的微信聊天记忆?

你是否曾因手机存储不足而被迫删除珍贵的微信聊天记录?那些深夜的谈心、重要的承诺、温馨的日常对话,是否随着时间流逝而逐渐模糊?WeChatMsg正是为每一位珍视数字记忆的用户量身打造的工具,让你能够轻松提取微信聊天记录,并将其转化为HTML、Word、CSV三种格式永久保存,更能生成年度聊天报告,让每一段对话都成为永恒的数字档案。 ## 项目亮点速览 🔹 **全格式支持** - 一键导出为HT

gitblog_01126的博客 928

如何永久保存你的微信聊天记录?WeChatMsg开源工具完全指南

你是否曾因手机更换而丢失珍贵的聊天记录?是否担心那些充满回忆的对话随着时间流逝而消失?在数字时代,我们的聊天记录不仅是简单的文字交流,更是生活的见证、情感的载体和记忆的宝库。今天,我要向你介绍一个完全免费的开源工具——WeChatMsg,它能让你的微信聊天记录永久保存,并转化为有价值的数字资产。 ## 为什么你需要专业的聊天记录备份工具? 微信已经成为我们生活中不可或缺的沟通工具,但官方并没有

gitblog_00619的博客 410

如何永久保存微信聊天记录?WeChatMsg开源工具完整指南

你是否曾因手机丢失、系统升级或误删而永久失去了珍贵的微信聊天记录?那些包含重要工作沟通、情感对话和生活回忆的聊天数据,一旦丢失就再也找不回来了。😢 这正是WeChatMsg项目要解决的核心问题——让每个人都能轻松备份和永久保存自己的微信聊天记录! WeChatMsg是一个开源工具,能够将微信聊天记录完整导出为HTML、Word、CSV等多种格式,实现数据的永久保存和深度分析。无论你是想备份重要

gitblog_00730的博客 419

如何永久保存你的微信聊天记忆?这个开源工具让你轻松掌控个人数字资产

你是否曾担心手机损坏或更换设备后,那些珍贵的微信聊天记录会永远消失?😟 在数字时代,我们的聊天记录不仅仅是文字对话,更是生活记忆的数字化载体。WeChatMsg作为一款完全免费的开源工具,专门帮助你提取微信聊天记录并永久保存,让你的数字记忆不再丢失,真正实现"我的数据我做主"。 ## 🎯 为什么你需要关注个人聊天数据的保存? 在微信成为我们生活重要组成部分的今天,聊天记录包含了太多珍贵信息

gitblog_00512的博客 1059

如何永久保存微信聊天记录:WeChatMsg完整指南让你轻松备份珍贵记忆

你是否曾经因为手机更换而丢失了重要的微信聊天记录?那些珍贵的对话、商务沟通、家庭回忆是否随着时间流逝而逐渐模糊?今天我要向你介绍一款完全免费的开源工具——WeChatMsg,它能够让你轻松地将微信聊天记录永久保存下来,不再担心数据丢失的烦恼。这款强大的工具不仅能备份数据,还能生成精美的年度聊天报告,让你的社交记忆真正属于你自己。 ## 为什么你需要永久保存微信聊天记录? 在数字时代,我们的重要

gitblog_01105的博客 969

如何快速导出微信聊天记录:留痕项目完整指南

在数字时代,你是否担心珍贵的**微信聊天记录**会因手机更换或意外丢失而永远消失?**微信聊天记录导出**是每个珍视数字记忆的用户都需要的功能,而留痕项目正是为此而生的开源解决方案。这个强大的工具让你能够将微信聊天记录永久保存为HTML、Word、CSV等多种格式,还能生成精美的年度聊天报告,真正实现"我的数据我做主"。 ## 为什么你需要专业的微信聊天记录备份工具? 微信承载着我们生活中太多

gitblog_00783的博客 386
上一篇: RecyclerView控件实现横向滚动和瀑布流布局,以及RecyclerView的点击监听(项目已上传GitHub)
下一篇: Fragment碎片的基本使用(手机平板需要更好地兼容)
Android_牧
博客等级 码龄9年 88粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值