参考文章:仿微信朋友圈点击评论自动定位到相关行

一、思路:

1、在点击【评论】控件的时候弹出一个 dialog,dialog 上面为 ScrollView,下面为输入框,实现键盘弹出时把输入框顶上去的效果;

2.计算 RecyclerView 应该滑动的距离;

3.监听键盘的显示和隐藏,隐藏时将 dialog dismiss;

在写的过程中做了一点修改:

1.在为列表中【评论】控件设置点击事件回调时将整个 itemView 作为参数传递给回调方法,觉得这样会容易理解一些,也能直接涵盖【评论】控件设置了 margin 的情况,即输入框上部是和列表对应 item 底部对齐的;

2.添加点击 dialog 中 scrollView,dialog 消失的事件;

二、实现步骤及代码片段

1.列表的显示不用说,看下【评论】点击事件代码:

//评论按钮点击事件
itemView.findViewById(R.id.tv_comment).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//这里将整个 itemView 传递过去,position 没用到,留着没什么影响 :)((MainActivity) mContext).showInputDialog(itemView, getAdapterPosition());}});

showInputDialog 方法在 MainActivity 中:

/*** 显示评论输入 dialog** @param itemView* @param position*/public void showInputDialog(View itemView, int position) {final int itemBottomY = getCoordinateY(itemView) + itemView.getHeight();//item 底部y坐标dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);View view = LayoutInflater.from(this).inflate(R.layout.dialog_input, null);dialog.setContentView(view);//scrollView 点击事件,点击时将 dialog dismiss,设置 onClick 监听无效dialog.findViewById(R.id.scrollView).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP)dialog.dismiss();return true;}});dialog.show();itemView.postDelayed(new Runnable() {@Overridepublic void run() {LinearLayout llCommentInput = dialog.findViewById(R.id.ll_comment_input);int y = getCoordinateY(llCommentInput);Log.i("display", "itemBottomY = " + itemBottomY + "  input text y = " + y);//滑动 RecyclerView,是对应 item 底部和输入框顶部对齐rv_content.smoothScrollBy(0, itemBottomY - y);}}, 300);}

获取屏幕中控件左上顶点y坐标方法

/*** 获取控件左上顶点 y 坐标** @param view* @return*/private int getCoordinateY(View view) {int[] coordinate = new int[2];view.getLocationOnScreen(coordinate);return coordinate[1];}

2.监听键盘的显示和隐藏做相关操作

有两种方法:
(1)

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {handleWindowChange();}});

(2)

    getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {@Overridepublic void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {handleWindowChange();}});

对应的 handleWindowChange() 方法:

/*** 监听键盘的显示和隐藏*/private void handleWindowChange() {Rect rect = new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);//获取当前界面显示范围Log.i("display  ", "top = " + rect.top);Log.i("display  ", "bottom = " + rect.bottom);int displayHeight = rect.bottom - rect.top;//app内容显示高度,即屏幕高度-状态栏高度-键盘高度int totalHeight = getWindow().getDecorView().getHeight();//显示内容的高度和屏幕高度比大于 0.8 时,dismiss dialogif ((float) displayHeight / totalHeight > 0.8)//0.8只是一个大致的比例,可以修改if (null != dialog && dialog.isShowing())dialog.dismiss();}

3.点击最后一项 item 的时候特殊处理:
原本键盘弹出时,会自动把 recyclerview 往上顶(当然,这跟当前 activity 设置的 windowSoftInputMode 有关),但是,现在键盘弹出时上面多了一个输入的布局,会导致在点击最后一个 item 的时候被遮挡一部分,所以,最后一个 item 点击时要做特殊处理,即给 recyclerView 添加一个和输入布局等高的 item。方法如下:

输入框弹出时候的处理:

 /*** 显示评论输入 dialog** @param itemView* @param position*/public void showInputDialog(View itemView, final int position) {final int itemBottomY = getCoordinateY(itemView) + itemView.getHeight();//item 底部y坐标dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);View view = LayoutInflater.from(this).inflate(R.layout.dialog_input, null);dialog.setContentView(view);//scrollView 点击事件,点击时将 dialog dismiss,设置 onClick 监听无效dialog.findViewById(R.id.scrollView).setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP)dialog.dismiss();return true;}});dialog.show();itemView.postDelayed(new Runnable() {@Overridepublic void run() {LinearLayout llCommentInput = dialog.findViewById(R.id.ll_comment_input);int y = getCoordinateY(llCommentInput);Log.i("display", "itemBottomY = " + itemBottomY + "  input text y = " + y);//最后一个 item 特殊处理,添加一个和输入框等高的 item,使 RecyclerView 有足够的空间滑动if (position == adapter.data.size() - 1) {adapter.data.add(new BottomBean());adapter.bottomHeight = llCommentInput.getHeight();adapter.notifyDataSetChanged();}//滑动 RecyclerView,是对应 item 底部和输入框顶部对齐rv_content.smoothScrollBy(0, itemBottomY - y);}}, 300);}

隐藏输入框时的处理:

/*** 监听键盘的显示和隐藏*/private void handleWindowChange() {Rect rect = new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);//获取当前界面显示范围Log.i("display  ", "top = " + rect.top);Log.i("display  ", "bottom = " + rect.bottom);int displayHeight = rect.bottom - rect.top;//app内容显示高度,即屏幕高度-状态栏高度-键盘高度int totalHeight = getWindow().getDecorView().getHeight();//显示内容的高度和屏幕高度比大于 0.8 时,dismiss dialogif ((float) displayHeight / totalHeight > 0.8)//0.8只是一个大致的比例,可以修改if (null != dialog && dialog.isShowing()) {dialog.dismiss();//如果添加了空白 item ,移除空白 itemif (adapter.data.get(adapter.data.size() - 1) instanceof BottomBean) {adapter.data.remove(adapter.data.size() - 1);adapter.notifyDataSetChanged();}}}

GitHub 地址:https://github.com/YINQIEIE/weixinCommnetDemo

仿微信朋友圈点击评论自动定位到对应位置相关推荐

  1. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能

    最近闲来无事,随便看看各种UI实现的代码 打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的Recyc ...

  2. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能.pdf

    Android仿仿微微信信朋朋友友圈圈点点击击评评论论自自动动定定位位到到相相关关行行功功能能 这篇文章主要介绍了android仿微信朋友圈点击评论自动定位到相关行功能的实现,本文图文并茂给大家介绍的 ...

  3. android 查找朋友圈,Android仿微信朋友圈点击评论自动定位到相关行功能

    最近闲来无事,随便看看各种UI实现的代码 打开你的微信朋友圈,点击评论,你就会发现有一个小细节:文本输入框的高度恰好定位到这条信息的底部位置 这个实现起来其实很简单,咱们就来看看吧 最简单的Recyc ...

  4. android点击加号,Android仿微信朋友圈点击加号添加图片功能

    本文为大家分享了类似微信朋友圈,点击+号图片,可以加图片功能,供大家参考,具体内容如下 xml: xmlns:app="http://schemas.android.com/apk/res- ...

  5. 仿QQ空间、微信朋友圈点击评论弹出输入框

    从上周开始一直在寻找仿QQ空间.朋友圈类似的弹出输入框,并且需要解决键盘不遮挡内容的解决方案 在网上寻寻觅觅始终不得解,后来无意中看见一篇百度百科的文章总算给了我解决的思路 这个就是给了我启发的文章 ...

  6. Android仿微信朋友圈3评论输入框及点击外部和列表滑动时隐藏输入框和键盘解决方法

    接着上一篇的评论点赞弹框之后,这次来说说微信的评论输入框,点击屏幕外部评论框和键盘消失,滑动列表时输入框和键盘也要消失,这里不是说一定要舔微信啥的,只是单纯从技术角度出发,分析原理和实现,解决我们自己 ...

  7. 仿微信朋友圈点点点 赞和评论

    <template><view class=""><view class="" style="display: flex ...

  8. Android仿微信朋友圈4实现评论动态时输入框和软键盘自动定位到内容下面

    最近做完朋友圈功能后,测试提出一个功能优化,在某些发布的动态下评论时软键盘和输入框遮当内容了,这个用户体验感觉不是很好,于是根据今日头条和其他热门的App评论时软键盘和输入框都是在内容下面.Scrol ...

  9. Android自定义弹窗模仿微信,Android 仿微信朋友圈点赞和评论弹出框功能

    本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多&q ...

最新文章

  1. 【译】权益证明的设计理念
  2. 作为算法工程师,在咨询公司工作的另类体验
  3. 如何根据一个ABAP类方法的名称反差到类名称
  4. 打断点的方式_一位清华退休老教授:作为家长如果能管住孩子这3点,将来会成才...
  5. Android Studio插件GsonFormat详解
  6. html5播放flv
  7. 偶遇的webshell,那得冲一波
  8. QT 录制音频(麦克风、系统)
  9. VMware安裝Ubuntu 16.04.4-server服务器版
  10. idea怎么进行c语言编程_idea编写c语言
  11. 科研伦理与学术规范 期末考试2(40题)
  12. 语音识别之语音特征提取一
  13. MySQL 字符串数字转换
  14. MongoDB学习指导
  15. 【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你
  16. 学校wifi覆盖解决方案
  17. springBoot中使用定时任务
  18. 访问非法内存区和内存泄漏
  19. showdoc windows 搭建_windows下安装showdoc
  20. 夫妻离婚财产怎么分配房屋财产

热门文章

  1. 不靠体育赛事,咪咕视频还有多大发展空间?
  2. 低代码局中局:是IT革命还是高级外包? | 甲子光年
  3. php获取服务器运行时间差,解决php服务器时间差异
  4. Hive SQL 使用不了union all : SemanticException Cartesian products are disabled for safety reasons
  5. Visual Studio 11开发指南(5)Visual Studio 11 IDE增强
  6. hbase的master启动失败 master running as process 9400. Stop it first.
  7. 中创软件哪个部分是外包_什么是外包| 第1部分
  8. 科技,美学,人性——交互设计的十字路口
  9. Signing for ‘xxx‘ requires a development team.
  10. sign-file: certs/signing_key.pem: 解决方法