253 lines
10 KiB
Plaintext
253 lines
10 KiB
Plaintext
朋友圈内容修改功能说明
|
||
====================
|
||
|
||
本文档记录了三个页面(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 临时变量保存引用
|
||
|