0
点赞
收藏
分享

微信扫一扫

OnGlobalLayoutListener 无限循环调用onGlobalLayout的问题

您好 2022-04-29 阅读 77

在一个Android项目中需要用到OnGlobalLayoutListener去监听软键盘是否弹出,然后动态更新布局,在使用过程中发现无限循环调用onGlobalLayout()方法,应该比较影响性能,一开始以为是OnGlobalLayoutListener本身设计如此。后来一琢磨发现果然有猫腻,因为我在onGlobalLayout中动态更新view,是不是又触发了onGlobalLayout,由此陷入无限循环,严重影响性能。后来多方尝试,加了个标志位做控制就成功解决了这个问题。

 private class MyLayoutListener implements OnGlobalLayoutListener {
        private MyLayoutListener() {
        }

        // 监听键盘弹起
        public void onGlobalLayout() {
            if (rootView != null) {
                try {
                  //  Logger.log("GlobalLayout");
                   removeGlobalListener();// pang,先remove,,防止循环调用
                    Rect rect = new Rect();
                    rootView.getWindowVisibleDisplayFrame(rect);
                    if (rootView.getRootView().getHeight() - (rect.bottom - rect.top) > getdip(100.0f)) {// 键盘弹出
                        if(!isKeyboardShow){//,防止循环调用
                            isKeyboardShow = true;
                            showEdittingView();
                        }
                    } else if(isKeyboardShow){
                        isKeyboardShow = false;// ,防止循环调用
                        showEditedView();
                    }
                    rootView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
举报

相关推荐

0 条评论