解决在软键盘弹出的时候挤压或者遮盖原有的布局

首先来看一下两种情况,对用户来说体验真是不好

第一种:试图被遮盖,用户看不到输入的框框


第二种情况:试图整个被往上挤压,导致博主上面的标题栏被顶上去了


这两种站在用户的角度上都是不好的,所以给出一种方案

思路:获取到键盘弹出的时候的高度,然后让部分试图移动一下下,为什么说部分试图呢?因为就像博主这里的标题栏博主就不希望他有所改变,下面是实现的效果图


键盘弹出的时候并没有相应的api给我们调用,但是可以通过另一种方式实现.我们就设置软键盘的模式是遮盖我们的布局的.那么键盘弹出必然导致我们的activity的根试图被覆盖,这时候会导致视图的重新调整,所以这时候我们只需要监听视图被重新安排了的回调,然后根据整个根布局的高度和可见的高度算出被遮盖的高度,也就是键盘的高度,然后,在让部分布局向上滚动一段距离,这段距离就是键盘的高度!

那么上代码

    /**
     * @param root             最外层布局
     * @param needToScrollView 要滚动的布局,就是说在键盘弹出的时候,你需要试图滚动上去的View,在键盘隐藏的时候,他又会滚动到原来的位置的布局
     */
    private void controlKeyboardLayout(final View root, final View needToScrollView) {
        root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            private Rect r = new Rect();

            @Override
            public void onGlobalLayout() {
                //获取当前界面可视部分
                ConversationAct.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
                //获取屏幕的高度
                int screenHeight = ConversationAct.this.getWindow().getDecorView().getRootView().getHeight();
                //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
                int heightDifference = screenHeight - r.bottom;
                needToScrollView.scrollTo(0, heightDifference);
            }
        });
    }

此方法还不是最好的方法,如果l列表中的item只有少数的,那么键盘弹出之后,信息就被滚动上去了,所以后来博主又写了另一种方法,就是算出键盘弹出的时候,列表或者说需要被调整的布局的高度.那么也是可以达到要求的


有问题欢迎留言哦

发布了119 篇原创文章 · 获赞 274 · 访问量 37万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览