Android 软键盘弹出 【遮挡输入框】【遮挡RecyclerView】的问题解决
16lz
2021-01-23
Android 在EditText进行软键盘弹出时,通常会遮挡输入框,遮挡RecyclerView
解决方案:全局监听屏幕当前显示布局的大小以及实际该布局的高度,如果实际显示的高度大于屏幕高度,则视为软键盘弹出,进行控件的动态改变即可。
private ViewTreeObserver.OnGlobalLayoutListener getGlobalLayoutListener(final View decorView, final View editView,final View barrageRlView) { return new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ==================================== = 根视图的高度,及显示在屏幕的高度 ==================================== Rect r = new Rect(); decorView.getWindowVisibleDisplayFrame(r); ==================================== = 根布局的实际高度 ==================================== int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels; int diff = height - r.bottom; ======================================================================== = 实际view所占高度与显示高度的差 差值较大的时候即为软键盘弹出 通常差值为零时,软键盘折叠 =========================================================================//Logger.d(Logger._JN, "onGlobalLayout height :%s r.bottom %s editView.getBottom :%s navBottomHeight : %s", //height, r.bottom, editView.getBottom(), height - editView.getBottom()); ========================================================================= = 当根布局的实际高度与显示高度产生差值的时候,判定软键盘弹出 ========================================================================= if (diff >= 25) { ========================================================================= = 软键盘弹出,如果recyclerView的条目过多,可以将最后一条数据显示到前端,避免被遮挡 ========================================================================= mBarragesRl.scrollToPosition(mBarrageAdapter.data().size() -1); //将EditTextView进行向上移动 if (editView.getPaddingBottom() != diff - (height - editView.getBottom())) { editView.setPadding(0, 0, 0, diff - (height - editView.getBottom()) - mDiff); } } else { mDiff = diff; ========================================================================= = 将EditTextView复原 ========================================================================= if (editView.getPaddingBottom() != 0) { editView.setPadding(0, 0, 0, 0); } } } }; } @Override protected void initViews(Bundle savedInstanceState) { decorView = getActivity().getWindow().getDecorView(); decorView.getViewTreeObserver().addOnGlobalLayoutListener(getGlobalLayoutListener(decorView, mEditArea));}
更多相关文章
- android编辑布局文件时非要降低api level或者更改主题才能显示布
- android的frameworks层键盘事件处理流程分析
- Android 线性布局:LinearLayout
- Android学习笔记-Android非布局activity中布局文件及控件加载方
- Android应用开发学习之相对布局
- Android merge抽象布局介绍
- android View页面布局总结 最全总结。
- Android系统回顾(三):UI之GridLayout布局
- android软键盘enter键的替换与事件监听