场景:
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; } }