first commit

Change-Id: Ib7c2ab10a2562044fcaf9879388a6cbc1db6ac61
This commit is contained in:
rw0067680
2025-12-23 09:56:21 +08:00
parent 3e80f94dfb
commit c01808ac21
2877 changed files with 195924 additions and 0 deletions

View File

@@ -0,0 +1,252 @@
朋友圈内容修改功能说明
====================
本文档记录了三个页面PengyouquanDetailActivity、PengyouquanActivity、DiscoveryFragment中朋友圈条目的修改功能。
一、修改的文件列表
------------------
1. uikit/src/main/java/cn/wildfire/chat/kit/user/PengyouquanDetailActivity.java
2. uikit/src/main/java/cn/wildfire/chat/kit/user/PengyouquanActivity.java
3. app/src/main/java/com/xunpaisoft/social/im/main/DiscoveryFragment.java
4. uikit/src/main/res/layout/adapter_user_comment_item.xml
二、功能修改详情
----------------
1. 位置显示功能
------------
功能描述:在朋友圈条目中显示位置信息,格式为"城市·具体位置"
实现方式:
- 获取 city 和 poi 字段
- 显示格式city + "·" + poi
- 如果没有位置信息,则隐藏位置显示
代码位置:
- PengyouquanDetailActivity.java: 第143-149行
- PengyouquanActivity.java: 第481-489行
- DiscoveryFragment.java: 第517-525行
示例显示:
"西安市·陕西省图书馆(高新馆区)"
2. 删除朋友圈功能
--------------
功能描述:如果是自己的朋友圈,显示删除按钮,点击后可以删除
实现方式:
- 判断当前用户ID是否与朋友圈发布者ID一致
- 如果一致,显示删除按钮
- 点击删除按钮,弹出确认对话框
- 确认后调用删除API删除成功后刷新列表或关闭页面
代码位置:
- PengyouquanDetailActivity.java: 第149-185行
- PengyouquanActivity.java: 第332-370行
- DiscoveryFragment.java: 第332-369行
3. 回复评论功能
------------
功能描述:点击评论项可以回复该评论,支持回复评论者和被回复人
实现方式:
- 点击评论项,弹出评论输入对话框
- 对话框提示"回复 XXX"
- 提交评论时,如果是对评论的回复,传递 comment_id 参数
- 评论成功后刷新评论列表
代码位置:
- PengyouquanDetailActivity.java: 第447-501行
- PengyouquanActivity.java: 第620-666行
- DiscoveryFragment.java: 第617-663行
4. 删除评论功能
------------
功能描述:长按自己的评论可以删除该评论
实现方式:
- 判断评论是否属于当前用户
- 如果是自己的评论,添加长按监听器
- 长按后弹出删除确认对话框
- 确认后调用删除评论API
- 删除成功后刷新评论列表
代码位置:
- PengyouquanDetailActivity.java: 第503-520行长按监听第552-590行删除方法
- PengyouquanActivity.java: 第668-685行长按监听第790-830行删除方法
- DiscoveryFragment.java: 第665-682行长按监听第921-978行删除方法
5. 富文本评论显示(解决折行留白问题)
---------------------------------
功能描述将评论显示改为富文本格式解决两个TextView导致的折行留白问题
实现方式:
- 使用 SpannableStringBuilder 构建完整的评论文本
- 隐藏原来的昵称TextViewtv_ada_name
- 只使用一个TextViewtv_ada_content显示完整评论
- 使用 ForegroundColorSpan 设置不同部分的颜色
- 格式:昵称 + " 回复 " + 被回复人 + ": " + 评论内容
代码位置:
- PengyouquanDetailActivity.java: 第378-499行
- PengyouquanActivity.java: 第556-608行
- DiscoveryFragment.java: 第553-605行
布局修改:
- adapter_user_comment_item.xml: 将 tv_ada_content 宽度改为 match_parent
6. 昵称点击跳转功能
---------------
功能描述:点击评论中的昵称(评论者或被回复人)可以跳转到对应的用户信息页面
实现方式:
- 使用 ClickableSpan 为昵称添加点击事件
- 点击评论者昵称:跳转到评论者的用户信息页面
- 点击被回复人昵称:跳转到被回复人的用户信息页面
- 使用 UserViewModel 获取用户信息
- 跳转到 UserInfoActivity 并传递用户信息
代码位置:
- PengyouquanDetailActivity.java: 第440-453行评论者第470-485行被回复人
- PengyouquanActivity.java: 第619-632行评论者第649-664行被回复人
- DiscoveryFragment.java: 第612-625行评论者第642-655行被回复人
7. 昵称颜色设置
------------
功能描述:将评论中昵称的颜色设置为 #ff202938深灰色
实现方式:
- 定义 nameColor = Color.parseColor("#ff202938")
- 使用 ForegroundColorSpan 设置昵称颜色
- 在 NoUnderlineClickableSpan 的 updateDrawState 中明确设置颜色,避免被默认链接颜色覆盖
代码位置:
- PengyouquanDetailActivity.java: 第428行颜色定义第62-77行NoUnderlineClickableSpan类
- PengyouquanActivity.java: 第599行颜色定义第89-104行NoUnderlineClickableSpan类
- DiscoveryFragment.java: 第592行颜色定义第95-110行NoUnderlineClickableSpan类
8. 字体大小设置
------------
功能描述:将评论区的字体大小设置为 14sp
实现方式:
- 在布局文件中将 tv_ada_content 的 textSize 设置为 14sp
代码位置:
- adapter_user_comment_item.xml: 第26行
9. 移除昵称下划线
--------------
功能描述:移除可点击昵称的下划线,保持文本样式美观
实现方式:
- 创建自定义 NoUnderlineClickableSpan 类
- 重写 updateDrawState 方法,调用 ds.setUnderlineText(false)
- 在 updateDrawState 中明确设置颜色,避免被默认链接颜色覆盖
代码位置:
- PengyouquanDetailActivity.java: 第62-77行
- PengyouquanActivity.java: 第89-104行
- DiscoveryFragment.java: 第95-110行
10. 评论点击事件修复
-----------------
功能描述:修复评论列表中点击回复评论和删除评论有时候点不上的问题
问题原因:
- TextView 设置了 LinkMovementMethod 会拦截所有触摸事件
- 当点击非 ClickableSpan昵称区域时事件被消费但不触发操作
- 导致 itemView 的 onClick 和 onLongClick 无法触发
实现方式:
- 在 TextView 上添加 OnTouchListener手动判断点击位置
- 如果点击在 ClickableSpan昵称让 LinkMovementMethod 处理,触发昵称点击跳转
- 如果点击在非 ClickableSpan评论内容手动触发 itemView 的点击或长按事件
- 使用 Handler.postDelayed 实现长按延迟触发500ms无需等到手指抬起
代码位置:
- PengyouquanDetailActivity.java: 第598-680行触摸监听器
- PengyouquanActivity.java: 第768-840行触摸监听器
- DiscoveryFragment.java: 第764-836行触摸监听器
技术要点:
- 在 ACTION_DOWN 时记录位置和时间,如果不在 ClickableSpan 上,启动延迟任务
- 延迟 500ms 后触发长按事件,无需等到手指抬起
- 在 ACTION_UP 时,如果已触发长按则不再处理点击,否则处理短按
- 在 ACTION_MOVE 时,如果移动距离过大,取消长按任务
- 使用 final 变量保存事件监听器引用,以便在内部类中使用
三、技术实现要点
----------------
1. SpannableStringBuilder 使用
- 使用 SpannableStringBuilder 构建富文本
- 使用 ForegroundColorSpan 设置文本颜色
- 使用 ClickableSpan 添加点击事件
- 使用 LinkMovementMethod 使文本可点击
2. 颜色设置优先级
- ClickableSpan 的 updateDrawState 会覆盖 ForegroundColorSpan 的颜色
- 解决方案:在 NoUnderlineClickableSpan 的 updateDrawState 中明确设置颜色
- 通过构造函数传入目标颜色,在 updateDrawState 中应用
3. 评论数据结构
- GetCommentInfoResult.ListBean 包含:
* user_id: 评论者用户ID
* nickname: 评论者昵称
* receiver_id: 被回复人用户ID
* receiver: 被回复人昵称
* content: 评论内容
4. 用户信息获取
- 使用 UserViewModel.getUserInfo(userId, true) 获取用户信息
- 需要传入用户ID和是否刷新标志
- 获取成功后跳转到 UserInfoActivity
5. API调用
- 删除评论POST /api/post/commentDel参数 comment_id
- 删除朋友圈:调用 AppService.Instance().postpyqDelete()
- 回复评论:调用 AppService.Instance().publishComment(),带 comment_id 参数
6. 触摸事件处理
- TextView 设置 LinkMovementMethod 后会拦截触摸事件
- 需要在 OnTouchListener 中手动判断点击位置
- 使用 Handler.postDelayed 实现长按延迟触发
- 需要处理 ACTION_DOWN、ACTION_UP、ACTION_MOVE、ACTION_CANCEL 事件
- 内部类中引用的变量必须是 final 或 effectively final
四、修改前后对比
----------------
修改前:
- 位置只显示 poi不显示 city
- 评论使用两个TextView导致折行留白
- 昵称颜色为蓝色(#576B95
- 昵称有下划线
- 昵称不可点击
- 字体大小为 13sp
- 没有删除评论功能
- 没有回复评论功能
修改后:
- 位置显示格式city·poi
- 评论使用单个TextView富文本显示无折行留白
- 昵称颜色为深灰色(#ff202938
- 昵称无下划线
- 昵称可点击跳转到用户信息页面
- 字体大小为 14sp
- 支持删除自己的评论长按500ms后立即触发无需抬起手指
- 支持回复评论(点击评论项,点击非昵称区域即可触发)
- 修复了点击事件有时无法触发的问题
五、注意事项
------------
1. 颜色设置必须在 NoUnderlineClickableSpan 的 updateDrawState 中明确设置,否则会被默认链接颜色覆盖
2. 使用 LinkMovementMethod 才能使 ClickableSpan 生效
3. 删除评论和回复评论都需要实名认证检查DiscoveryFragment中
4. 评论列表刷新需要在删除或回复成功后调用相应方法
5. TextView 设置 LinkMovementMethod 后会拦截触摸事件,需要在 OnTouchListener 中手动处理非 ClickableSpan 区域的点击
6. 长按事件使用 Handler.postDelayed 实现延迟触发在达到时间阈值500ms时立即触发无需等到手指抬起
7. 内部类中引用的变量必须是 final 或 effectively final需要使用 final 临时变量保存引用