Android通过ViewTreeObserver获得输入法键盘弹起后可见区域高度

需求:项目中需要获取输入法键盘弹起后,手机屏幕可见区域高度(即手机屏幕高度-输入法高度)

解决方法:OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。

 mRLAll.getViewTreeObserver().addOnGlobalLayoutListener(
                    new OnGlobalLayoutListener() {
                        @SuppressLint("NewApi")
                        public void onGlobalLayout() {
                            //移除布局变化监听
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                                mRLAll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                            } else {
                                mRLAll.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                            }
                            //getWindow().getDecorView().getViewTreeObserver().removeGlobalOnLayoutListener(this);
                            Rect r = new Rect();
                            mRLAll.getWindowVisibleDisplayFrame(r);
                            TestLog.i(TAG, "lent = " + (r.height()));
                            int height = r.height()+r.top;//手机屏幕可见区域高度
                        }
                    });

note:

  1.mRLAll是当前页面根view  

  2.当前activity未设置全屏幕,所以可见区域高度= r.height()+r.top,r.top是状态栏高度;如果设置为全屏显示,则可见区域高度= r.height()

  3.OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener移除掉

转载于:https://www.cnblogs.com/xuepeng0521/p/5570516.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值