android 输入法弹出时不能挡住按钮把布局顶上去

最近在做注册登录界面,刷刷刷的做完了,也已经上线了。突然有一天产品拿着手机跑到我这里说,这个注册界面用户体验太差了,每次输入完一行信息后,都要把输入法收回去,然后再输入下一行,甚至把注册的按钮给挡住了。心想之前我做的基本都是这样的,不会特意去处理这个,看来这次必须得解决了。网上也找了很多的资料,很多都是讲在AndroidManifest中去修改windowSoftInputMode   这个属性,但是这个还是解决不了输入法挡住按钮的问题,不是很完美。有些文章说要把布局弄成线性布局,然后使用layout_weight设置权重,虽然有效,但不能适用于各种布局的情况。在经过了一个下午的摸索,网上查找资料后,终于实现了自己想要的效果,登录/注册按钮都在输入法的上面了。

思路:我们可以监听输入法的输入,当输入法打开的时候,我们就把要移动的布局通过属性动画往上移动,当输入法收回去的时候再把要移动的布局往下移回去。

//根布局
        bind.mRlContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                bind.mRlContainer.getWindowVisibleDisplayFrame(r);
                if (sc == null) {
                    sc = new int[2];
                    bind.mLlLogin.getLocationOnScreen(sc);
                }
                //r.top 是状态栏高度
                int screenHeight = bind.mRlContainer.getRootView().getHeight();
                int softHeight = screenHeight - r.bottom;
                if (scrollHegit == 0&&softHeight>120)
                    scrollHegit = sc[1] +bind.mLlLogin.getHeight() -(screenHeight-softHeight);//可以加个5dp的距离这样,按钮不会挨着输入法
                if (softHeight > 120) {//当输入法高度大于100判定为输入法打开了  设置大点,有虚拟键的会超过100
                    if (bind.mRlContainer.getScrollY() != scrollHegit)
                        scrollToPos(0, scrollHegit);
                } else {//否则判断为输入法隐藏了
                    if (bind.mRlContainer.getScrollY() != 0)
                        scrollToPos(scrollHegit, 0);
                }
            }
        });
private void scrollToPos(int start, int end) {
        ValueAnimator animator = ValueAnimator.ofInt(start, end);
        animator.setDuration(250);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                bind.mRlContainer.scrollTo(0, (Integer) valueAnimator.getAnimatedValue());
            }
        });
        animator.start();
    }
修改之前的



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值