目录
一、项目演示
二、项目测试环境
三、项目详情
四、完整的项目源码
一、项目演示
网络资源模板--仿微信聊天App
二、项目测试环境
三、项目详情
登陆注册
### 登录功能(`LoginActivity`)
1. **界面初始化**:设置界面元素,包括昵称和密码输入框,以及登录和注册按钮。
2. **登录点击事件**:用户点击登录按钮时,验证输入的昵称和密码:
- 检查昵称和密码是否为空。
- 验证用户是否存在。
- 调用 `UserManager` 进行登录验证。
3. **状态反馈**:根据登录结果,给用户显示相应的提示信息(如用户不存在或密码错误)。
4. **消息更新**:如果登录成功,尝试更新聊天信息和好友列表。
5. **页面跳转**:登录成功后跳转到主界面 (`HomeActivity`),或注册界面 (`RegisterActivity`)。
### 注册功能(`RegisterActivity`)
1. **界面初始化**:设置界面元素,包括昵称和密码输入框,以及注册和登录按钮。
2. **注册点击事件**:用户点击注册按钮时,验证输入的昵称和密码:
- 检查昵称和密码是否为空。
- 验证用户是否已经存在。
- 调用 `UserManager` 进行用户注册。
3. **状态反馈**:根据注册结果,给用户显示相应的提示信息(如用户已存在或注册成功)。
4. **页面跳转**:注册成功后跳转到登录界面 (`LoginActivity`)。
### 总结
- 两个活动都使用了基本的输入验证,确保用户输入有效的信息。
- 使用 `UserManager` 进行用户相关操作(检查用户存在性、登录、注册)。
- 使用 `Toast` 显示反馈信息,提升用户体验。
private void initView() {
etNickname = findViewById(R.id.etNickname);
etPassword = findViewById(R.id.etPassword);
findViewById(R.id.btLogin).setOnClickListener(this::onLoginClick);
findViewById(R.id.tvGotoRegister).setOnClickListener(v -> gotoRegisterActivity());
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
private boolean isExistsUser(String nickname) {
return UserManager.isExistsUser(nickname);
}
private boolean registerUser(String nickname, String password) {
return UserManager.registerUser(nickname, password);
}
消息页面
### 消息功能(`MessageFragment`)
#### 1. 界面初始化
在 `onCreateView` 方法中,加载布局文件 `fragment_message` 并调用 `initView()` 方法进行视图初始化,主要包括:
- **空视图** (`tvEmpty`):用于显示没有消息的提示。
- **RecyclerView**:用于显示消息列表。
#### 2. 数据初始化
在 `onStart` 方法中,调用 `initData()` 方法来加载和更新消息数据:
- 从 `ChatManager` 获取所有好友的消息。
- 根据消息列表是否为空,显示或隐藏空视图,并更新消息列表。
#### 3. 适配器设置
在 `initView()` 方法中,设置 RecyclerView 的布局管理器为 `LinearLayoutManager`,并为 RecyclerView 添加点击支持:
- 使用 `ItemClickSupport` 设置点击事件监听器,点击某个消息项时跳转到聊天界面。
#### 4. 跳转到聊天界面
当用户点击某条消息时,调用 `gotoChatActivity(String nickname)` 方法,创建跳转到 `ChatActivity` 的 Intent,并传递好友的昵称。
---
### 总结
- `MessageFragment` 负责展示用户的好友消息,提供良好的用户体验。
- 使用 RecyclerView 显示消息列表,并通过适配器动态更新数据。
- 实现了消息项的点击事件,允许用户快速进入聊天界面。
private void initData() {
List<Message> myAllFriendMessages = ChatManager.findMyAllFriendMessage(); // 获取所有好友消息
if (myAllFriendMessages == null || myAllFriendMessages.isEmpty()) { // 如果消息为空
tvEmpty.setVisibility(View.VISIBLE); // 显示空视图
messages.clear(); // 清空消息列表
} else {
tvEmpty.setVisibility(View.GONE); // 隐藏空视图
messages.clear(); // 清空消息列表
messages.addAll(myAllFriendMessages); // 添加所有好友消息到消息列表
}
messageAdapter.notifyDataSetChanged(); // 通知适配器数据已更新
}
聊天页面
### 聊天功能(`ChatActivity`)
#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_chat` 并调用 `initView()` 方法来初始化界面元素,主要包括:
- **好友昵称**:从 Intent 中获取并显示在标题栏。
- **返回按钮**:点击返回按钮时关闭当前活动。
- **消息输入框**:用于输入聊天消息。
- **发送按钮**:点击发送按钮触发消息发送操作。
- **RecyclerView**:用于展示聊天消息列表,设置布局管理器为 `LinearLayoutManager`。
#### 2. 数据初始化
在 `onResume` 方法中,调用 `initData()` 方法加载与好友的聊天记录:
- 从 `ChatManager` 获取好友的所有消息。
- 更新消息列表并通知适配器数据已变更。
#### 3. 发送消息
通过 `doSendMessage(String msg)` 方法处理消息发送:
- 验证输入内容是否为空或超出字符限制(200字)。
- 调用 `ChatManager.sendMessage(nickname, msg)` 发送消息,如果成功,清空输入框并更新消息列表。
#### 4. 删除消息
通过 `showDeleteDialog(final Message message)` 方法实现消息的删除功能:
- 显示确认删除对话框,用户选择“确定”后调用 `ChatManager.deleteMessage(message)` 删除消息。
- 删除成功后更新消息列表,删除失败则显示提示。
#### 5. 提示信息
使用 `showToast(String message)` 方法向用户显示即时提示信息,例如消息发送失败或成功等。
---
### 总结
- `ChatActivity` 实现了与特定好友的聊天功能,包括发送和删除消息。
- 使用 `ChatAdapter` 显示消息列表,提供良好的用户交互体验。
- 通过合理的输入验证和提示,提升应用的用户体验和可靠性。
private void doSendMessage(String msg) {
if (msg.trim().isEmpty()) {
showToast("发送消息不可为空");
} else if (msg.trim().length() > 200) {
showToast("发送消息不可大于200字");
} else {
Message message = ChatManager.sendMessage(nickname, msg);
if (message != null) {
etMessage.setText(""); // 清空输入框
messages.add(message);
chatAdapter.notifyDataSetChanged(); // 更新适配器
} else {
showToast("发送消息失败");
}
}
}
联系人页面
### 通讯录功能(`AddressBookFragment`)
#### 1. 界面初始化
在 `onCreateView` 方法中,加载布局文件 `fragment_address_book` 并调用 `initView()` 方法进行界面元素的初始化,主要包括:
- **搜索框** (`etSearch`):用于输入好友名称进行搜索。
- **搜索按钮** (`btSearch`):点击后执行搜索操作。
- **空视图** (`tvEmpty`):在没有好友时显示的提示。
- **添加好友按钮**:点击后跳转到添加好友界面。
#### 2. 数据初始化
在 `onResume` 方法中,调用 `initData()` 方法来加载和更新好友列表:
- 从 `FriendManager` 获取所有好友数据。
- 根据好友列表是否为空,显示或隐藏空视图,并更新好友列表。
#### 3. 搜索好友
通过搜索按钮的点击事件,获取输入的搜索内容并更新查询条件,随后调用 `initData()` 方法刷新好友列表。
#### 4. 跳转到好友详情
通过 `gotoFriendActivity(Friend friend)` 方法实现点击好友项时跳转到好友详情界面,传递好友的昵称。
#### 5. 跳转到添加好友界面
通过 `gotoAddFriendActivity()` 方法实现点击添加好友按钮时跳转到 `AddFriendActivity`。
---
### 总结
- `AddressBookFragment` 提供了查看和搜索好友的功能,通过 RecyclerView 显示好友列表。
- 实现了搜索功能,允许用户快速找到好友,并通过点击好友项查看详细信息。
- 界面友好,支持用户添加新好友,提升了应用的社交互动性。
private void initData() {
List<Friend> allFriend = FriendManager.findAllFriend(query);
if (allFriend == null || allFriend.isEmpty()) {
tvEmpty.setVisibility(View.VISIBLE);
friends.clear();
friendAdapter.notifyDataSetChanged();
} else {
tvEmpty.setVisibility(View.GONE);
friends.clear();
friends.addAll(allFriend);
friendAdapter.notifyDataSetChanged();
}
}
好友详情页面
### 好友详情功能(`FriendActivity`)
#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_friend` 并调用 `initView()` 方法来初始化界面元素,主要包括:
- **返回按钮**:点击时关闭当前活动。
- **好友昵称**:从 Intent 中获取好友的昵称并显示在 TextView 中。
- **聊天按钮**:点击后跳转到聊天界面。
- **删除按钮**:点击后弹出确认对话框以确认删除好友。
#### 2. 弹出确认对话框
在删除按钮的点击事件中,使用 `AlertDialog` 弹出确认对话框:
- 对话框显示好友昵称并询问用户是否确认删除。
- 提供“确认”和“取消”两个选项,用户选择“确认”后调用 `confirmDelete()` 方法。
#### 3. 删除好友
在 `confirmDelete(DialogInterface dialogInterface, int i)` 方法中处理好友删除的逻辑:
- 调用 `doDeleteFriends(nickname)` 方法尝试删除好友。
- 删除成功时显示成功提示,设置结果并关闭当前活动;删除失败时显示失败提示。
#### 4. 进入聊天界面
通过 `gotoChatActivity(String nickname)` 方法,点击聊天按钮时启动 `ChatActivity`,并传递好友昵称。
#### 5. 执行删除好友的操作
在 `doDeleteFriends(String nickname)` 方法中,调用 `FriendManager.deleteFriend(nickname)` 方法进行好友删除操作。
---
### 总结
- `FriendActivity` 提供了查看好友详细信息、聊天和删除好友的功能。
- 界面友好,使用确认对话框来防止误操作,提升用户体验。
- 成功删除好友后,设置结果以通知相关的 Fragment 更新其好友列表。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@id/tvTitle"
android:layout_width="fill_parent"
android:layout_height="55.0dip"
android:background="#ff6750a4"
android:gravity="center"
android:text="好友"
android:textColor="@color/white"
android:textSize="22.0dip"
android:textStyle="bold" />
<ImageView
android:id="@id/ivBack"
android:layout_width="55.0dip"
android:layout_height="55.0dip"
android:layout_alignParentStart="true"
android:padding="10.0dip"
android:src="@mipmap/icon_back" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tvTitle"
android:layout_marginTop="40.0dip"
android:orientation="vertical"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="好友昵称:"
android:textSize="14.0dip" />
<TextView
android:id="@id/tvNickname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14.0dip" />
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/btChat"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@id/btDelete"
android:layout_marginStart="20.0dip"
android:layout_marginEnd="20.0dip"
android:text="聊天" />
<Button
android:id="@+id/btDelete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="20.0dip"
android:layout_marginTop="10.0dip"
android:layout_marginEnd="20.0dip"
android:layout_marginBottom="40.0dip"
android:text="删除好友" />
</RelativeLayout>
添加好友页面
### 添加好友功能(`AddFriendActivity`)
#### 1. 界面初始化
在 `onCreate` 方法中,设置布局文件 `activity_add_friend` 并调用 `initView()` 方法初始化界面元素,包括:
- **返回按钮**:点击时关闭当前活动。
- **添加好友按钮**:点击后调用 `onAddFriendClick()` 方法处理添加好友逻辑。
#### 2. 添加好友逻辑
在 `onAddFriendClick(EditText etNickname)` 方法中,执行以下检查:
- 检查昵称是否为空,若为空则显示提示。
- 检查是否试图添加自己为好友,若是则显示提示。
- 检查用户是否存在,若不存在则显示提示。
- 检查好友是否已存在,若已存在则显示提示。
- 若所有检查通过,弹出确认对话框确认添加好友。
#### 3. 确认添加好友
在确认对话框中,若用户选择“确认”,调用 `addFriend(nickname)` 方法:
- 调用 `doAddFriends(nickname)` 执行添加好友操作。
- 根据操作结果显示成功或失败的提示,并关闭当前活动。
#### 4. 辅助方法
- `showToast(String message)`:用于显示提示信息。
- `isMySelf(String nickname)`:检查是否为自己。
- `isExistsUser(String nickname)`:检查用户是否存在。
- `isExistsFriend(String nickname)`:检查好友是否已存在。
---
### 总结
- `AddFriendActivity` 提供了添加好友的功能,界面友好并通过多重检查避免用户错误操作。
- 通过确认对话框提升了用户体验,并在操作成功或失败时提供即时反馈。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@id/tvTitle"
android:layout_width="fill_parent"
android:layout_height="55.0dip"
android:background="#ff6750a4"
android:gravity="center"
android:text="添加好友"
android:textColor="@color/white"
android:textSize="22.0dip"
android:textStyle="bold" />
<ImageView
android:id="@+id/ivBack"
android:layout_width="55.0dip"
android:layout_height="55.0dip"
android:layout_alignParentStart="true"
android:padding="10.0dip"
android:src="@mipmap/icon_back" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tvTitle"
android:layout_marginTop="40.0dip"
android:orientation="vertical"
android:paddingStart="20.0dip"
android:paddingEnd="20.0dip">
<EditText
android:id="@id/etNickname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入好友昵称"
android:singleLine="true" />
</LinearLayout>
<Button
android:id="@+id/btAdd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="20.0dip"
android:layout_marginEnd="20.0dip"
android:layout_marginBottom="40.0dip"
android:text="添加" />
</RelativeLayout>
朋友圈页面
### 朋友圈界面(`FriendsCircleFragment`)
#### 1. 界面初始化与数据加载
- **布局与视图初始化**:在 `onCreateView` 方法中通过 `LayoutInflater` 加载 `fragment_friends_circle` 布局,并初始化视图。
- **数据初始化**:在 `initData()` 方法中,通过 `FriendsCircleManager` 获取所有朋友圈消息:
- 如果消息列表为空,显示空数据提示 (`tvEmpty`),清空朋友圈消息列表,并通知适配器更新。
- 如果有数据,则隐藏空数据提示,清空现有朋友圈消息列表,添加新数据,并通知适配器更新。
#### 2. 视图与适配器设置
- **初始化视图**:在 `initView()` 方法中,设置空数据提示 (`tvEmpty`) 和发送消息按钮 (`ivSendMessage`) 的点击事件监听器。
- **RecyclerView 设置**:设置 `RecyclerView` (`recycleView`) 的布局管理器为 `LinearLayoutManager`,并使用自定义的 `FriendsCircleAdapter` 设置适配器,传入朋友圈消息列表。
#### 3. 点击事件处理
- **发送消息按钮点击事件**:点击发送消息按钮 (`ivSendMessage`) 时,调用 `gotoSendMessageActivity()` 方法跳转到 `SendMessageActivity`。
#### 4. 数据适配器与数据更新
- **数据适配器**:使用 `FriendsCircleAdapter` 对 `RecyclerView` 进行数据绑定。
- **数据更新**:根据从 `FriendsCircleManager` 获取的数据更新朋友圈消息列表,并通过适配器通知 `RecyclerView` 更新显示。
#### 5. 生命周期管理
- **`onResume()` 方法**:在 `onResume()` 方法中,调用 `initData()` 方法重新加载数据,确保每次回到该界面都能更新显示最新的朋友圈消息。
---
### 总结
- `FriendsCircleFragment` 实现了显示朋友圈消息列表的功能,通过 `RecyclerView` 和自定义的适配器 `FriendsCircleAdapter` 实现数据展示。
- 界面友好地处理了空数据情况,并提供发送消息的入口。
- 通过 `FriendsCircleManager` 管理朋友圈消息的获取,确保界面数据的及时更新和显示。
private void initData() {
List<FriendCircleMessage> allFriendCircleMessage = FriendsCircleManager.findAllFriendCircleMessage();
if (allFriendCircleMessage == null || allFriendCircleMessage.isEmpty()) {
this.tvEmpty.setVisibility(0);
this.friendCircleMessages.clear();
this.friendsCircleAdapter.notifyDataSetChanged();
return;
}
this.tvEmpty.setVisibility(8);
this.friendCircleMessages.clear();
this.friendCircleMessages.addAll(allFriendCircleMessage);
this.friendsCircleAdapter.notifyDataSetChanged();
}
发布页面
我的页面
### 个人信息界面(`MyFragment`)
#### 1. 界面初始化
- **布局加载**:在 `onCreateView` 方法中,通过 `LayoutInflater` 加载 `fragment_my` 布局,并调用 `initView()` 方法进行视图初始化。
#### 2. 视图设置
- **注销功能**:
- 设置注销按钮 (`btLogout`) 的点击监听器。在点击时,调用 `UserManager.logout()` 方法执行注销操作。
- 如果注销成功,显示提示消息“退出成功”,并调用 `gotoLoginActivity()` 方法跳转到登录界面。
- **昵称显示**:
- 从 `UserManager` 获取当前登录用户的昵称,并设置到 `TextView` (`tvNickname`) 中显示。
#### 3. 跳转到登录活动
- **跳转方法**:`gotoLoginActivity()` 方法创建一个 `Intent`,用于启动 `LoginActivity`,同时结束当前活动,确保用户无法返回到注销后的界面。
---
### 总结
- `MyFragment` 提供了用户个人信息的展示和注销功能,界面友好且简单易用。
- 通过 `UserManager` 进行用户管理,确保用户状态的正确性。
- 成功注销后,用户将被引导回登录界面,增强了用户体验。
package com.example.wechat.fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import com.example.wechat.R;
import com.example.wechat.activity.LoginActivity;
import com.example.wechat.db.UserManager;
public class MyFragment extends Fragment {
private View root; // 根视图
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_my, container, false); // 加载布局文件
initView(); // 初始化视图
return root;
}
private void initView() {
// 设置注销按钮的点击监听器
root.findViewById(R.id.btLogout).setOnClickListener(view -> {
if (UserManager.logout()) { // 注销操作
Toast.makeText(getContext(), "退出成功", Toast.LENGTH_SHORT).show(); // 显示成功提示
gotoLoginActivity(); // 跳转到登录界面
}
});
// 设置昵称文本框的内容
((TextView) root.findViewById(R.id.tvNickname)).setText(UserManager.getLoginUser().getName());
}
// 跳转到登录活动
private void gotoLoginActivity() {
startActivity(new Intent(getContext(), LoginActivity.class)); // 创建并启动登录活动的Intent
requireActivity().finish(); // 结束当前活动
}
}
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇