网络资源模板--基于Android Studio 实现的聊天App

发布于:2025-07-11 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

一、测试环境说明

二、项目简介

三、项目演示

四、部设计详情(部分)

注册页

首页

聊天页

五、项目源码 


一、测试环境说明

电脑环境

Windows 11

编写语言

Kotlin

开发软件

Android Studio  (2024.2.1 Patch 3)

二、项目简介

该项目基于Android Studio软件开发,使用Kotlin语言编写,采用SQLite数据库存储用户信息、好友关系和聊天记录,并通过SharedPreferences实现本地数据缓存。

系统包含完整的用户模块(登录/注册)、好友管理(添加/删除/搜索)、实时聊天(收发消息/会话列表)三大核心功能,并设计了广播机制实现全局强制下线功能。

界面采用Fragment+RecyclerView实现多页面动态交互,整体架构采用DAO模式分层管理数据,主要采用传统 MVC 模式,是一个功能完备的即时通讯应用。

三、项目演示

网络资源模板--基于Android studio 聊天App

四、部设计详情(部分)

注册页

package com.ecapull.mychat.activity

import android.app.DatePickerDialog
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.*
import androidx.appcompat.app.AlertDialog
import com.ecapull.mychat.R
import com.ecapull.mychat.data.DBHelper
import com.ecapull.mychat.data.User
import com.ecapull.mychat.data.UserDaoImpl
import com.ecapull.mychat.data.UserInfo
import com.ecapull.mychat.data.UserInfoDaoImpl
import java.util.Calendar

class RegisterActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)
        findViewById<RadioButton>(R.id.radiobutton_male).isChecked = true
    }


    fun onRegister(view: View) {
        // 获取输入的数据
        val username = findViewById<EditText>(R.id.edit_username).text.toString()
        val password = findViewById<EditText>(R.id.edit_password).text.toString()
        val confirmPassword =
            findViewById<EditText>(R.id.edit_confirm_password).text.toString()
        val nickname = findViewById<EditText>(R.id.edit_nickname).text.toString()

        val radioGroup = findViewById<RadioGroup>(R.id.radioGroup_gender)
        val gender =
            radioGroup.findViewById<RadioButton>(radioGroup.checkedRadioButtonId).text.toString()

        Log.d(
            "Register", "username:${username}" +
                    "password:${password}" +
                    "confirmPassword:${confirmPassword}" +
                    "nickname:${nickname}" +
                    "gender:${gender}"
        )

        // 验证输入
        val regex = "\\d+".toRegex()
        val usernameValid = (username.length == 11) && regex.matches(username)
        val passwordValid = password.length in 8..12
        val confirmPasswordValid = (confirmPassword == password)
        val nicknameValid = nickname.length in 1..20

        // 数据合法则进行注册
        if (usernameValid && passwordValid && confirmPasswordValid && nicknameValid) {
            val dbHelper = DBHelper(this)
            val userDao = UserDaoImpl(dbHelper)
            //在数据库中添加账号信息
            val user = User(null, username, password)
            var res = userDao.addUser(user)
            if (res) {
                //添加用户信息
                val userInfo = UserInfo(userDao.getIdByUsername(username), gender, nickname)
                val userInfoDao = UserInfoDaoImpl(dbHelper)
                res = res and userInfoDao.addUserInfo(userInfo)

            }
            dbHelper.close()

            val builder = AlertDialog.Builder(this)
            if (res) {
                //添加成功,跳出提示
                builder.setTitle("注册成功")
                builder.setMessage("账号:${user.username},注册成功!")
                builder.setPositiveButton("确认") { _, _ ->
                    finish()
                }
            } else {
                builder.setTitle("注册失败")
                builder.setMessage("账号已被注册")
            }
            val dialog = builder.create()
            dialog.show()
        } else {
            Toast.makeText(this, "注册失败,请检查注册信息是否符合要求", Toast.LENGTH_SHORT).show()
        }
    }



    fun onCancel(view: View) {
        finish()
    }


}

1. 页面的结构  

该页面采用垂直线性布局作为根容器,整体分为上下两部分。上半部分包含用户注册所需的各类输入框和选择控件,采用权重布局确保在不同屏幕尺寸下都能合理分配空间。

下半部分固定放置注册和取消两个按钮,通过边距控制与其他元素的间距。

表单区域包含手机号、密码、确认密码、昵称等文本输入框,以及性别选择的单选按钮组,所有表单元素都配有对应的标签提示。

2. 使用到的技术  

该界面运用了Android基础UI组件技术,包括文本视图、编辑框、单选按钮组和按钮等核心控件。

通过XML样式复用技术统一了表单元素的显示风格,采用权重布局实现响应式设计。

数据验证方面使用正则表达式检查手机号格式,并实现了密码一致性校验。

数据持久化层采用SQLite数据库配合DAO模式,通过事务处理确保用户基本信息和详细信息的原子性操作。

3. 页面详细介绍  

这是一个标准的用户注册页面,主要功能是收集用户的基本注册信息。页面顶部显示醒目的蓝色注册标题,下方依次排列手机号、密码、确认密码、昵称等必填字段,其中密码输入框特别标注了长度要求提示。

性别选择采用水平排列的单选按钮组,默认选中男性选项。底部两个操作按钮采用不同样式区分主次操作,注册按钮使用自定义背景突出显示。所有输入项都设置了严格的格式验证逻辑,确保数据的有效性。

首页

package com.ecapull.mychat.fragment

import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.ecapull.mychat.R
import com.ecapull.mychat.adapter.Chat
import com.ecapull.mychat.adapter.ChatAdapter
import com.ecapull.mychat.data.DBHelper
import com.ecapull.mychat.data.MessageDAOImpl


class ChatFragment(var userID: Int) : Fragment() {
    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: ChatAdapter
    private lateinit var context: Context

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_chat, container, false)

        context = requireContext()

        recyclerView = view.findViewById(R.id.recyclerView)

        // 设置RecyclerView的布局管理器
        val layoutManager = LinearLayoutManager(context)
        recyclerView.layoutManager = layoutManager

        // 初始化适配器
        adapter = ChatAdapter(mutableListOf<Chat>(), userID)
        recyclerView.adapter = adapter

        //  在这里设置适配器的数据源
        loadData()

        return view
    }

    private fun loadData() {
        // 加载用户的聊天
        val dao = MessageDAOImpl(DBHelper(context))
        adapter.reloadData(dao.getChatsForUserId(userID))
    }

    override fun onResume() {
        super.onResume()
        // 在界面返回时重新加载数据
        loadData()
    }
}

1. 页面的结构  

该页面采用垂直的线性布局,顶部是一个蓝色的标题栏,显示"消息列表"字样,高度固定为40dp并设置了阴影效果。

下方是一个充满剩余空间的RecyclerView,用于展示聊天列表。每个聊天项包含昵称、最新消息内容和时间三个文本视图,整体布局简洁清晰。

列表项支持点击跳转至聊天详情页,长按可触发删除会话的确认对话框。

2. 使用到的技术  

该页面运用了RecyclerView实现高性能列表展示,配合自定义适配器处理数据绑定和交互逻辑。

时间显示采用智能格式化技术,当天消息只显示时间,非当天显示完整日期。

数据层通过DAO模式访问SQLite数据库获取聊天记录。交互方面实现了点击跳转和长按删除功能,通过AlertDialog提供二次确认机制,确保操作安全性。

3. 页面详细介绍  

这是一个典型的聊天列表界面,顶部有醒目的蓝色标题栏,下方动态加载用户的聊天会话列表。每个会话项显示对方昵称、最后一条消息内容和时间戳,时间自动优化为最简格式。

点击会话项会跳转到对应的聊天页面,长按则弹出删除确认对话框。界面会在每次恢复显示时自动刷新数据,确保信息时效性。整体设计遵循Material Design规范,交互流畅自然。

聊天页

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#EFEFEF"
        tools:context=".activity.ChatActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/linearLayout_title"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#529DED"
            app:layout_constraintTop_toTopOf="parent"
            android:orientation="horizontal">

        <TextView
                android:id="@+id/text_contact_people"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/contact_person"
                android:textColor="@color/white"
                android:textSize="24sp"
                android:textStyle="bold"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="4dp"
                android:background="@android:color/transparent"
                android:drawableStart="@drawable/icons8_back_30"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:onClick="onBack"
        />
    </androidx.constraintlayout.widget.ConstraintLayout>


    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView_messages"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout_title"
            app:layout_constraintBottom_toTopOf="@+id/linearLayout"
    />

    <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:gravity="center"
            android:orientation="horizontal"
            android:padding="4dp"
            app:layout_constraintBottom_toBottomOf="parent">

        <EditText
                android:id="@+id/edit_message"
                android:layout_width="0dp"
                android:layout_height="38dp"
                android:layout_marginHorizontal="4dp"
                android:layout_weight="1"
            android:autofillHints=""
            android:textColor="@color/black"
                android:paddingHorizontal="5dp"
                android:inputType="textMultiLine"
                android:background="@drawable/edit_text_bg"
                android:shadowColor="@color/black"
            tools:ignore="LabelFor" />
        <Button
                android:id="@+id/button_send_message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:background="@drawable/custom_btn"
                android:text="@string/send"
                android:textColor="@color/white"
                android:textSize="20sp"
                android:onClick="onSendMessage"
        />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

1. 页面的结构  

该聊天界面采用约束布局作为根容器,整体分为三部分:顶部蓝色标题栏显示联系人名称和返回按钮,中间区域是消息列表的RecyclerView,底部是消息输入框和发送按钮组成的输入区域。

消息列表区分发送和接收两种视图类型,分别使用不同的布局样式展示。输入区域包含一个多行文本编辑框和圆形发送按钮,整体布局层次分明,符合常见即时通讯应用的界面规范。

2. 使用到的技术  

该页面运用了RecyclerView的多类型视图技术,根据消息发送者动态切换左右布局样式。

时间显示采用智能格式化,当天消息仅显示时间,历史消息显示完整日期。数据层通过DAO模式操作SQLite数据库,实现消息的增删改查。

交互方面实现了消息自动滚动到底部、输入内容清空等细节处理,整体采用MVVM架构模式分离界面逻辑与数据处理。

3. 页面详细介绍  

这是一个功能完整的聊天对话界面,顶部标题栏动态显示对方昵称。消息列表区分左右两侧显示收发消息,左侧为接收消息(灰色背景),右侧为发送消息(蓝色背景),每条消息包含发送者昵称、内容及时智能格式化的时间戳。

底部输入框支持多行文本输入,发送按钮点击后即时更新消息列表并自动滚动到最新消息。

界面在打开时会自动加载历史聊天记录,保持对话连续性。整体设计符合现代IM应用交互规范

五、项目源码 

👇👇👇👇👇快捷方式👇👇👇👇👇


网站公告

今日签到

点亮在社区的每一天
去签到