您当前的位置: 首页 >  android
  • 2浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android软键盘遮挡editText解决

沙漠一只雕得儿得儿 发布时间:2018-11-27 17:33:13 ,浏览量:2

在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点击相应按钮,这样的用户体验非常不好。

解决方案: 第一步:使用getWindowVisibleDisplayFrame()来获取当前窗口可视区域大小的。它是View类下的一个方法 第二步:使用scrollTo方法,当键盘弹起时,计算出不可视区域高度,让界面整体上移;键盘收起后,让界面整体下移

参考文章:

getWindowVisibleDisplayFrame():https://www.cnblogs.com/ldq2016/p/6835366.html

整体移动:https://blog.csdn.net/smileiam/article/details/69055963

全局的listener:

private ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener;

在进入界面时注册它:

/**
     * 添加GlobalLayoutListener用于处理软键盘弹起遮盖问题
     */
    private void addGlobalLayoutListener() {
        if (mRootLayout != null && mLocationEditText != null) {
            if (mOnGlobalLayoutListener == null) {
                mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        Rect rect = new Rect();
                        mRootLayout.getWindowVisibleDisplayFrame(rect);//这个是获取可见区域的关键
                        int mainInvisibleHeight = mRootLayout.getRootView().getHeight() - rect.bottom; //这里根据可见区域计算出不可见区域
                        if (mainInvisibleHeight > DimenUtils.getWindowHeight() / 4 && mLocationEditText.isFocused()) {
                            mRootLayout.scrollTo(0, DimenUtils.getWindowHeight() / 4); //1/4的原因是我们自己的edittext大概在屏幕的下1/4处,因此屏幕整体上移1/4就可以把遮挡住的edittext显示出来了,这里需要根据自己项目情况估算下合适的高度
                        } else {
                            mRootLayout.scrollTo(0, 0);
                        }
                    }
                };
            }
            mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
        }
    }

离开时注销掉:

/**
     * 移除GlobalLayoutListener
     */
    private void removeOnGlobalLayoutListener() {
        if (mRootLayout != null && mOnGlobalLayoutListener != null) {
            mRootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener);
        }
    }

具体为什么移动1/4,这个就要根据自己的界面需求自己估算了:

if (mainInvisibleHeight > DimenUtils.getWindowHeight() / 4 && mLocationEditText.isFocused()) {
    mRootLayout.scrollTo(0, DimenUtils.getWindowHeight() / 4);
} else {
    mRootLayout.scrollTo(0, 0);
}

 

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0459s