Files
zhini_im/(红头)朋友圈内容修改.txt
rw0067680 c01808ac21 first commit
Change-Id: Ib7c2ab10a2562044fcaf9879388a6cbc1db6ac61
2025-12-23 10:00:49 +08:00

253 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
朋友圈内容修改功能说明
====================
本文档记录了三个页面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 临时变量保存引用