Android 软键盘弹出 【遮挡输入框】【遮挡RecyclerView】的问题解决

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,Error)