android键盘的监听

作者: 傲娇的狗蛋 | 来源:发表于2018-03-19 22:19 被阅读0次

    android 键盘监听

    从知乎上看到的一种解决方案,目前还没发现有什么坑。

    public class SoftKeyBroadManager implements ViewTreeObserver.OnGlobalLayoutListener{
        
        public interface SoftKeyboardStateListener {
            void onSoftKeyboardOpened(int keyboardHeightInPx);
            void onSoftKeyboardClosed();
        }
    
        private final List<SoftKeyboardStateListener> listeners = new LinkedList<SoftKeyboardStateListener>();
        private final View activityRootView;
        private int lastSoftKeyboardHeightInPx;
        private boolean isSoftKeyboardOpened;
    
        public SoftKeyBroadManager(View activityRootView) {
            this(activityRootView,false);
        }
    
        public SoftKeyBroadManager(View activityRootView, boolean isSoftKeyboardOpened) {
            this.activityRootView = activityRootView;
            this.isSoftKeyboardOpened = isSoftKeyboardOpened;
            activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
        }
    
        @Override
        public void onGlobalLayout() {
            final Rect r = new Rect();
            activityRootView.getWindowVisibleDisplayFrame(r);
    
            final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
           
            if (!isSoftKeyboardOpened && heightDiff > 500) { 
                // 如果高度超过500 键盘可能被打开
                isSoftKeyboardOpened = true;
                notifyOnSoftKeyboardOpened(heightDiff);
            } else if (isSoftKeyboardOpened && heightDiff < 500) {
                isSoftKeyboardOpened = false;
                notifyOnSoftKeyboardClosed();
            }
        }
    
        public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) {
            this.isSoftKeyboardOpened = isSoftKeyboardOpened;
        }
    
        public boolean isSoftKeyboardOpened() {
            return isSoftKeyboardOpened;
        }
    
      
        public int getLastSoftKeyboardHeightInPx() {
            return lastSoftKeyboardHeightInPx;
        }
    
        public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
            listeners.add(listener);
        }
    
        public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
            listeners.remove(listener);
        }
    
        private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) {
            this.lastSoftKeyboardHeightInPx = keyboardHeightInPx;
    
            for (SoftKeyboardStateListener listener : listeners) {
                if (listener != null) {
                    listener.onSoftKeyboardOpened(keyboardHeightInPx);
                }
            }
        }
    
        private void notifyOnSoftKeyboardClosed() {
            for (SoftKeyboardStateListener listener : listeners) {
                if (listener != null) {
                    listener.onSoftKeyboardClosed();
                }
            }
        }
    
    }
    

    使用方法

    softKeyBroadManager = new SoftKeyBroadManager(root);
        softKeyBroadManager.addSoftKeyboardStateListener(softKeyboardStateListener);
    
    private SoftKeyBroadManager.SoftKeyboardStateListener softKeyboardStateListener = new
                SoftKeyBroadManager.SoftKeyboardStateListener() {
    
    
                    @Override
                    public void onSoftKeyboardOpened(int keyboardHeightInPx) {
                        PandaLogUtils.getInstance().i("键盘打开");
    
                    }
    
                    @Override
                    public void onSoftKeyboardClosed() {
                        PandaLogUtils.getInstance().i("键盘关闭");
                        //重新算价
                        calculate();
                    }
                };
    

    相关文章

      网友评论

        本文标题:android键盘的监听

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