Android View中getViewTreeObserver().addOnGlobalLayoutListener() (转)
转自:Android View中getViewTreeObserver().addOnGlobalLayoutListener()
我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件布局要在onResume回调后完成。所以现在需要使用getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度。这是获得一个view的宽度和高度的方法之一。
OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。
除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:
其中,我们可以利用OnGlobalLayoutListener来获得一个视图的真实高度。
- int mHeaderViewHeight;
- mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
- new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mHeaderViewHeight = mHeaderView.getHeight();
- getViewTreeObserver()
- .removeGlobalOnLayoutListener(this);
- }
- });
但是需要注意的是OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。
有时候需要在onCreate方法中知道某个View组件的宽度和高度等信息,而直接调用View组件的getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight()、getTop()、getLeft()等方法是无法获取到真实值的,只会得到0。这是因为View组件布局要在onResume回调后完成。下面提供实现方法,onGlobalLayout回调会在view布局完成时自动调用:
类似:
- // This listener is used to get the final width of the GridView and then calculate the
- // number of columns and the width of each column. The width of each column is variable
- // as the GridView has stretchMode=columnWidth. The column width is used to set the height
- // of each view so we get nice square thumbnails.
- mGridView.getViewTreeObserver().addOnGlobalLayoutListener( //view 布局完成时调用,每次view改变时都会调用
- new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- if (mAdapter.getNumColumns() == 0) {
- final int numColumns = (int) Math.floor(
- mGridView.getWidth() / (mImageThumbSize + mImageThumbSpacing));
- if (numColumns > 0) {
- final int columnWidth =
- (mGridView.getWidth() / numColumns) - mImageThumbSpacing;
- mAdapter.setNumColumns(numColumns); //设置 列数
- mAdapter.setItemHeight(columnWidth); //设置 高度
- }
- }
- }
- });
在gridview布局完成后,根据girdview的宽和高设置adapter列数和每个item高度
最新文章
- C#执行Dos命令公用方法
- C#的HTTP协议中POST与GET的区别
- Printf()输出格式控制(转)
- IOS网络编程。。
- LabView中,下拉列表和枚举有什么区别?
- Javascript操纵Cookie--转
- 初次了解CSS3
- StrPos,StrScan,
- Git中的merge命令实现中出现问题及其解决
- 单例模式(Singleton)看了就懂
- 神奇的 routing mesh - 每天5分钟玩转 Docker 容器技术(100)
- Python 抽象篇:面向对象之高阶用法
- [LeetCode] Equal Tree Partition 划分等价树
- GET和POST两种基本请求方法(转自博主--在途中#)
- [Docker] sh: docker-compose: not found
- [luogu P3953] [noip2017 d1t3] 逛公园
- PostgreSQL 问题总结
- 百度统计api获取数据
- Windows Server 2012 R2域控制器部署
- Lftp 简单使用步骤
热门文章
- linux安装mysql数据库(5.7之前的版本)
- hdu 1015 Safecracker 水题一枚
- iOS禁止多点操作(按钮和Table项)
- mybatis学习笔记(六)使用generator生成mybatis基础配置代码和目录结构
- NSPredicate 条件查询或过虑
- Introduction to the TestFlight SDK
- ubuntu16.04 ssh服无法远程连接解决办法
- appium window64安装教程
- wsdl2java在mac中点配置
- 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办