朋友圈内容修改功能说明 ==================== 本文档记录了三个页面(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 构建完整的评论文本 - 隐藏原来的昵称TextView(tv_ada_name) - 只使用一个TextView(tv_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 临时变量保存引用