Android软键盘挡住登录按钮的问题

来源:互联网 发布:filco圣手二代 知乎 编辑:程序博客网 时间:2024/06/10 08:35

     最近在做公司项目的时候,要求登录的时候,软键盘不能挡住登录按钮,然后本人百度了半天,各种方法都试过了,尝试了各种失败,以下是网上大神们提供的几种方法的罗列:

  • 给Activity配置 android:windowSoftInputMode
  • 给布局套加上ScrollView
  • RelativeLayout,判断软键盘的显示和隐藏,做不同的动作

在多次尝试过之后,遇到几个bug无法解决。在登陆界面的第二个输入框的问题:

     1.采用ScrollView.fullScroll(ScrollView.FOCUS_DOWN); 时候,发现光标一直在第一个框,这是因为ScrollView.FOCUS_DOWN始终把焦点置顶

   2,采用scrollView.scrollTo(0, scrollView.getHeight()); 时候,发现无法弹出软键盘,当延时设置为300毫秒时候才可以弹出。这是因为第一时间软键盘弹出需要短暂的时间,这时候去设置ScrollView时布局还没有完全重绘完成,也就不会有滑动效果,只有延迟之后就是估量布局稳定了的时候再进行ScrollView上滑才会有效果,这个地方使用过ScrollView的控制滑动的童鞋就应该遇到过!

最后狂刷百度终于找到一个采用在activity里采用动态代码的方式完成软件盘弹出不挡住并做了一定的优化


/**     * @param root         最外层布局,需要调整的布局     * @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部     */    private void controlKeyboardLayout(final View root, final View scrollToView) {        root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver                .OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                KLog.e("BEGIN");                Rect rect = new Rect();                //获取root在窗体的可视区域                root.getWindowVisibleDisplayFrame(rect);                //获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)                int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;                //若不可视区域高度大于100,则键盘显示                if (rootInvisibleHeight > 100) {                    KLog.e("SHENGD");                    int[] location = new int[2];                    //获取scrollToView在窗体的坐标                    scrollToView.getLocationInWindow(location);                    //计算root滚动高度,使scrollToView在可见区域                    KLog.e(location[1] + "");                    int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;                    if (srollHeight != 0) {                        root.scrollTo(0, srollHeight);                    }                } else {                    //键盘隐藏                    KLog.e("THRESS");                    root.scrollTo(0, 0);                }            }        });    }

注意要在oncreate里调用controlKeyboardLayout(mRelogin, mLoginLoginBtn);。

1.mRelogin为你的根布局,

2.mLoginLoginBtn为登陆按钮




   


1 0