Android通过ViewTreeObserver获得输入法键盘弹起后可见区域高度
2016-06-08 16:32
567 查看
需求:项目中需要获取输入法键盘弹起后,手机屏幕可见区域高度(即手机屏幕高度-输入法高度)
解决方法:OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。
note:
1.mRLAll是当前页面根view
2.当前activity未设置全屏幕,所以可见区域高度= r.height()+r.top,r.top是状态栏高度;如果设置为全屏显示,则可见区域高度= r.height()
3.OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener移除掉
解决方法: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移除掉
相关文章推荐
- xml namespace in android
- Android调用系统相机和相册
- activity 中的 onSaveInstanceState方法的调用时机
- Android调用系统相机和相册-填坑篇
- Android 官方推荐 : DialogFragment 创建对话框
- 如何解决Android 5.0中出现的警告:Service Intent must be explicit
- Android AudioRecord介绍与Android 6.0后的改变
- 37.调用系统下载服务下载文件
- Android Studio 中GBK中文乱码和因此无法运行程序的一些经验
- Android中使用GridView进行应用程序UI布局的教程
- Android之JNI NDK如何取消native support 重新add native support
- Android 摄像头拍照
- [置顶] Android开发主题分类(持续更新)
- Android推送、智能心跳解决方案、手机休眠对心跳的影响
- Android属性动画(Property Animation)
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- android前后摄像头切换
- Android Fragment 真正的完全解析(下)
- Android Fragment 真正的完全解析(上)
- Android Studio 快捷键整理分享