美文网首页高级UIAndroid安卓UI
Android监听键盘弹出收起并移动界面

Android监听键盘弹出收起并移动界面

作者: 景山道人 | 来源:发表于2019-03-26 19:44 被阅读57次

    Android 监听键盘弹出收起 - 掘金
    代码中所用的监听键盘部分来自这里

    目的:不使用AdjustPan达到AdjustPan的功能,用这个的话设置AdjustResize就好了,这种方法也可以自己修改键盘抬升的距离,相比系统默认顶到EditText底下会好一点吧。
    用法:new, add
    方法:计算EditText底部和当前更改后的Windows底部的差值,抬升这个差值就好了,应该不用考虑状态栏高度的问题
    问题:解决不了View捅进透明状态栏的问题,以及谁知道在什么手机上会不会冒出来些奇怪的问题
    解决方案:更新后可以自己传自己希望的contentView进去,不是最外层布局的话应该不会捅进透明状态栏里面去。
    其他:这个不用时记得删,不然会造成没必要的空间和时间损耗。
    这个监听调用次数特别频繁,所以不用时一定要remove掉。
    实际上因为这个会持有一个View的对象,可能还有别的更好的写法,本菜鸡设计模式比较菜emm,等哪天把设计模式翻一遍,有机会还会再更新

    更新:

    换了点内容,原来的类我还留着,放底下了。
    新的这个我换了个构造函数,现在可以直接传contentView进来,然后EditText是通过获取Activity再获取焦点的方式得到的,另外新增了一个键盘弹出时调用的Listener还有添加offset的接口

    import android.app.Activity;
    import android.graphics.Rect;
    import android.view.View;
    import android.view.ViewTreeObserver;
    import android.widget.EditText;
    
    public class KeyboardChangeHelper implements ViewTreeObserver.OnGlobalLayoutListener {
    
        private View contentView;
        private EditText targetView;
        private int rootViewVisibleHeight = 0;
        private int offset;
        private OnKeyboardShowListener listener;
    
        public KeyboardChangeHelper(View contentView) {
            this.contentView = contentView;
            setTranslationOffset(0);
        }
    
        @Override
        public void onGlobalLayout() {
            if (!initTargetView()) {
                return;
            }
            Rect r = new Rect();
            contentView.getWindowVisibleDisplayFrame(r);
            int visibleHeight = r.height();
            if (rootViewVisibleHeight == 0) {
                rootViewVisibleHeight = visibleHeight;
                return;
            }
            //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
            if (rootViewVisibleHeight == visibleHeight) {
                return;
            }
            //根视图显示高度变小超过200,可以看作软键盘显示了
            if (rootViewVisibleHeight - visibleHeight > 200) {
                rootViewVisibleHeight = visibleHeight;
                if (null != listener) {
                    listener.onKeyboardShow();
                }
                layoutResize(true, r.bottom);
                return;
            }
            //根视图显示高度变大超过200,可以看作软键盘隐藏了
            if (visibleHeight - rootViewVisibleHeight > 200) {
                rootViewVisibleHeight = visibleHeight;
                if (null != listener) {
                    listener.onKeyboardHide();
                }
                layoutResize(false, 0);
            }
        }
    
        private void layoutResize(boolean isKeyboardShow, int currentBottom) {
            int resizeHeight = 0;
            Rect rect = new Rect();
            if (null != targetView) {
                targetView.getGlobalVisibleRect(rect);
                // rect.bottom 获取到的时EditText的底部,加上offset是再往下offset距离的底部
                resizeHeight = rect.bottom + offset - currentBottom;
            }
            if (resizeHeight < 0) {
                return;
            }
            if (isKeyboardShow) {
                contentView.setTranslationY(-resizeHeight);
            } else {
                contentView.setTranslationY(0);
            }
        }
    
        private boolean initTargetView() {
            View focusedView;
            Activity activity = (Activity) contentView.getContext();
            if (null != activity) {
                focusedView = activity.getCurrentFocus();
            } else {
                return false;
            }
            if (focusedView instanceof EditText) {
                targetView = (EditText)focusedView;
            }
            return true;
        }
    
        public void addListener() {
            contentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
        }
    
        public void removeListener() {
            // remember to remove if used
            contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    
        public void setTranslationOffset(int offset) {
            this.offset = offset;
        }
    
        public void addOnKeyboardShowListener(OnKeyboardShowListener listener) {
            this.listener = listener;
        }
    
        public interface OnKeyboardShowListener {
            void onKeyboardShow();
            void onKeyboardHide();
        }
    }
    

    下面是原来的:

    import android.graphics.Rect;
    import android.view.View;
    import android.view.ViewTreeObserver;
    import android.widget.EditText;
    
    public class KeyboardChangeHelper implements ViewTreeObserver.OnGlobalLayoutListener {
    
        private View contentView;
        private EditText targetView;
        private int rootViewVisibleHeight = 0;
    
        public KeyboardChangeHelper(EditText targetView) {
            this.contentView = targetView.getRootView();
            this.targetView = targetView;
        }
    
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            contentView.getWindowVisibleDisplayFrame(r);
            int visibleHeight = r.height();
            System.out.println(""+visibleHeight);
            if (rootViewVisibleHeight == 0) {
                rootViewVisibleHeight = visibleHeight;
                return;
            }
            //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
            if (rootViewVisibleHeight == visibleHeight) {
                return;
            }
            //根视图显示高度变小超过200,可以看作软键盘显示了
            if (rootViewVisibleHeight - visibleHeight > 200) {
                rootViewVisibleHeight = visibleHeight;
                layoutResize(true, r.bottom);
                return;
            }
            //根视图显示高度变大超过200,可以看作软键盘隐藏了
            if (visibleHeight - rootViewVisibleHeight > 200) {
                rootViewVisibleHeight = visibleHeight;
                layoutResize(false, 0);
            }
        }
    
        private void layoutResize(boolean isKeyboardShow, int currentBottom) {
            int resizeHeight = 0;
            Rect rect = new Rect();
            if (null != targetView) {
                targetView.getGlobalVisibleRect(rect);
                resizeHeight = rect.bottom - currentBottom;
            }
            if (resizeHeight < 0) {
                return;
            }
            if (isKeyboardShow) {
                contentView.setTranslationY(-resizeHeight);
            } else {
                contentView.setTranslationY(0);
            }
        }
    
        public void addListener() {
            contentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
        }
    
        public void removeListener() {
            // remember to remove if used
            contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    }
    

    有爱自取,毕竟搞这个本身没什么技术含量,(有技术含量我也搞不出来)

    相关文章

      网友评论

        本文标题:Android监听键盘弹出收起并移动界面

        本文链接:https://www.haomeiwen.com/subject/sdunvqtx.html