页面随着软键盘的弹出而上移解决方案

场景:

1、软件盘挡住了edittext框了,这个必须处理。

2、虽然设置了edittext的软键盘属性android:windowSoftInputMode="adjustPan"使得软键盘不阻挡edittext,但是为了提高用户体验,想把下面的button也显示出来

3、登录界面,输入用户名时,由于框子较高,不需要移动。当用户点击密码输入框时才让view上移。也就是自由控制页面要不要随软键盘的弹出而上移。

针对以上三个场景的统一解决方案:(参照了别人的博客,地址找不到了,实在不好意思。添加了静态控制falg和动态获取系统底部导航高度的代码,原博文是写成了固定值100,在高分辨率的机器上不起作用,原因是分辨率高的机器,底部导航栏比100大,比如我的华为mate8,导航栏高度是108)

细节说明:目前很多机器可以控制底部导航栏隐藏,隐藏后,获取到的导航栏高度就为0了。

/**
 * Created by Administrator on 2017/3/11.
 */

public class SoftInputUtil {



//    控制是否移动布局。比如只有密码输入框获取到焦点时才执行。
    public static  boolean flag=true;
    /**
     *  @param act      activiry用于获取底部导航栏高度。
     * @param root         最外层布局,需要调整的布局
     * @param scrollToView 被键盘遮挡的scrollToView,滚动root,使scrollToView在root可视区域的底部
     */
    public static void controlKeyboardLayout(Context act, final View root, final View scrollToView) {
        final int navigationBarHeight = getNavigationBarHeight(act);

        root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                //获取root在窗体的可视区域
                root.getWindowVisibleDisplayFrame(rect);
                //获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)
                int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
                //若不可视区域高度大于100,则键盘显示
                if (rootInvisibleHeight > navigationBarHeight&&flag) {
                    int[] location = new int[2];
                    //获取scrollToView在窗体的坐标
                    scrollToView.getLocationInWindow(location);
                    //计算root滚动高度,使scrollToView在可见区域
                    int srollHeight = (location[1] + scrollToView.getHeight()) - rect.bottom;
                    if (root.getScrollY() != 0) {// 如果已经滚动,要根据上次滚动,重新计算位置。
                        srollHeight += root.getScrollY();
                    }
                    root.scrollTo(0, srollHeight);
                } else {
                    //键盘隐藏
                    root.scrollTo(0, 0);
                }
            }
        });
    }
    /**
     * 获取底部导航栏高度
     * @param act
     * @return
     */
    private static int getNavigationBarHeight(Context act) {
        Resources resources = act.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
        int height = resources.getDimensionPixelSize(resourceId);
        Log.v("dbw", "Navi height:" + height);
        return height;
    }
}
原文地址:https://www.cnblogs.com/epmouse/p/6537847.html