zoukankan      html  css  js  c++  java
  • 页面随着软键盘的弹出而上移解决方案

    场景:

    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;
        }
    }
  • 相关阅读:
    oracle恢复被覆盖的存储过程
    POJ 2478 Farey Sequence
    java不求有功,但求无过—异常处理
    图论-树的最大路
    MP3的频率、比特率、码率与音质的关系
    基于Lucene3.5.0怎样从TokenStream获得Token
    Groovy新手教程
    Binder机制1---Binder原理介绍
    UVA
    Hibernate Criterion
  • 原文地址:https://www.cnblogs.com/epmouse/p/6537847.html
Copyright © 2011-2022 走看看