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));
}