android获取view宽高的时机

2023-11-19

关键点:获取宽高应该在view的onLayout之后,这个时候,view已经确定算出宽高。
error:

/**
 * 在onCreate,onResume方法中调用,用于获取TextView的宽度和高度都是0
 */
private void getTextHeightAndWidth() {
        // 我们定义的用于获取宽度和高度的组件
        titleText = (TextView) findViewById(R.id.text_title);

        int height = titleText.getHeight();
        int width = titleText.getWidth();

        Log.i(TAG, "height:" + height + "  " + "width:" + width);
    }
06-26 20:12:15.356 19453-19453/uuch.com.Android_viewheight I/MainActivity: height:0  width:0 

正确时机:
1.在监听事件中获取:

/**
 * 这里的button1是我们定义的Button组件,并且我们重写了Button的点击事件,在其中调用了获取组件宽高的方法
 */
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getTextHeightAndWidth();
            }
        });

2.重写Activity的onWindowFocusChanged方法

/**
 * 重写Acitivty的onWindowFocusChanged方法
 */ 
@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        /**
         * 当hasFocus为true的时候,说明Activity的Window对象已经获取焦点,进而Activity界面已经加载绘制完成
         */
        if (hasFocus) {
            int widht = titleText.getWidth();
            int height = titleText.getHeight();
            Log.i(TAG, "onWindowFocusChanged width:" + widht + "   "
                            + "  height:" + height;
        }
    }

3.为组件添加OnGlobalLayoutListener事件监听

/**
 * 为Activity的布局文件添加OnGlobalLayoutListener事件监听,当回调到onGlobalLayout方法的时候我们通过getMeasureHeight和getMeasuredWidth方法可以获取到组件的宽和高
 */
private void initOnLayoutListener() {
        final ViewTreeObserver viewTreeObserver = this.getWindow().getDecorView().getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Log.i(TAG, "开始执行onGlobalLayout().........");
                int height = titleText.getMeasuredHeight();
                int width = titleText.getMeasuredWidth();

                Log.i(TAG, "height:" + height + "   width:" + width);
           // 移除GlobalLayoutListener监听     
                   MainActivity.this.getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
    }

4.使用View.post方法获取组件的宽高

/**
 * 使用View的post方法获取组件的宽度和高度,这里用的是异步消息获取组件的宽高,而这里的异步消息的执行过程是在主进程的主线程的Activity绘制流程之后,所以这时候可以获取组件的宽高。
 */
private void initViewHandler() {
        titleText.post(new Runnable() {
            @Override
            public void run() {
                int width = titleText.getWidth();
                int height = titleText.getHeight();

                Log.i(TAG, "initViewHandler height:" + height + "  width:" + width);
            }
        });
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android获取view宽高的时机 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • 共同的偏好不断消失

    我正在使用共享首选项来存储我的应用程序的登录凭据 除了一个用户之外 一切正常 一段时间后 共享偏好似乎会以某种方式重置或清除 我已针对该用户调整了我的应用程序 使其不再清除他的共享偏好设置 这样我就可以确定这不是我的应用程序的错 但即使在这
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Android 版 Robotium - solo.searchText () 不起作用

    我在使用 Robotium 时遇到 searchText 函数问题 我正在寻找这个字符串
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 通过 ADB 拔出设备:“找不到服务”

    我必须测试我的应用程序在打瞌睡模式下的行为 根据文档 https developer android com training monitoring device state doze standby html testing doze 我
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Android - 将 ImageView 保存到具有全分辨率图像的文件

    我将图像放入 ImageView 中 并实现了多点触控来调整 ImageView 中的图像大小和移动图像 现在我需要将调整大小的图像保存到图像文件中 我已经尝试过 getDrawingCache 但该图像具有 ImageView 的大小 我
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消

随机推荐

  • 第十三章 公告板与粒子系统 标签: ogre公告板粒子系统ogre粒子系统

    Ogre编程入门与进阶 第十三章 公告板与粒子系统 标签 ogre公告板粒子系统ogre粒子系统 2015 07 05 14 41 1365人阅读 评论 1 收藏 举报 分类 Orge模块 16 版权声明 本文为博主原创文章 未经博主允许不
  • macbook百度网盘下载保存的文件在哪❓找不到

    困扰我好久的问题终于被我解决了 之前在AppStore里下载百度网盘 然后在百度网盘里下载文件 除了能直接打开以后 怎么都找不到文件位置 后来我终于知道了 是因为在AppStore里下载的百度网盘根本不是mac版的 如果你想下载mac版的百
  • 安卓TabLayout的使用

    安卓TabLayout的使用 我们在进行安卓开发时 常常会使用到ViewPager 为了展示更美观的效果 我们经常会选择第三方的诸如TabPageIndicator等配合ViewPager使用 但是TabPageIndicator已经很老了
  • 简单地使用webpack进行打包

    下面的webpack是4 14 0版本的 当时我学的 更新太快了 现在5 10 0了 你学习的时候 用的是最新的 就不要往下看啦 官方文档已经更新教程了 这是我看5 10 0教程后 简单搭建的打包demo 可以参考 或者你也自己去官网看文档
  • SpringCloud-Alibaba Nacos

    Nacos 简介 为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母 最后的s为Service 是什么 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos Dynamic Nam
  • STM32的串口中断详解

    目录 中断配置 中断服务函数 1 中断服务函数名称查找 2 中断服务函数 3 可以选择的串口中断类型 extern u8 USART RX BUF USART REC LEN extern u16 USART RX STA 中断配置 使能接
  • js 字符串拼接的4种方法

    一 使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console log a 我是帅哥 二 模板字符串 模板字符串 template string 是增强版的字符串 用反引号 标识 特点 1 字符串中
  • 20221129-1Spring_day03(资料来自黑马程序)

    Spring day03 今日目标 理解并掌握AOP相关概念 能够说出AOP的工作流程 能运用AOP相关知识完成对应的案例编写 重点掌握Spring的声明式事务管理 1 AOP简介 前面我们在介绍Spring的时候说过 Spring有两个核
  • 【HTML】修复选中项与实际后台控制的选中项不一致的问题

    项目场景 项目场景 系统项目中有一个需要通过后台传递选中项的下拉项 由于反复确认都无法主动更新 考虑到其他人推荐的 方法 也是没有效果的 例如 无效
  • 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

    锌链接作为首个提出产业区块链的机构媒体 一直积极推动产业区块链落地 通过深度报道直戳行业痛点 通过分享会聆听行业声音 通过周报呈现行业大观 通过评论展现独特产业观察视角 本周 广州出台66条措施支持粤港澳大湾区金融发展 其中多项与区块链有关
  • CVPR 2023和ICLR 2023异常检测相关文章

    关键词 Anomaly Detection Outlier Detection Out of Distribution Abnomal Detecting Abnormal Detection Defect DetectionInspect
  • 两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

    导语 文章没有重复的地方 没有废话 如果能帮助到你 那是我的荣幸 记得一键三连哟 Fabric 配置文件详解 一 四个核心配置文件 二 Fabric 的核心配置文件 三 网络启动步骤 1 生成认证证书 crypto config yaml
  • JS 时区时间转换

    业务场景 页面服务器时间是东八区时间 页面 JS 功能需要对比服务器时间和用户本地时间 为兼容世界各地时间 需要将用户本地时间转换为东八区时间 基本概念 格林威治时间 格林威治子午线上的地方时 或零时区 中时区 的区时叫做格林威治时间 也叫
  • cocos2d-x 之 适配分辨率全屏的方法

    原文出处 https blog csdn net yixiao3660 article details 54316348https www jianshu com p 0d6787e31112 http dualface github io
  • 从架构师的角度看服务器端架构点滴

    任何服务器端的架构设计 都是性能 一致性和成本三者的权衡 从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲 我主要关注以下几个点 业务 可靠性 性能 可维护性 一 业务 框架上保证业务的快速迭代 在性能要求不高的情况下 同步架
  • ubuntu 安装 python3.9

    一 相关背景 之前在dockerfile里面一直使用的是python3 8 忘记为什么选择这个版本了 想用python3 9 因为觉得3 8有点老了 而且3 9一个重要的feature 是把list作为默认的类型 不需要从typing 里面
  • 微信公众号实现微信支付(含前后端完整代码)

    刚做完公众号微信支付 记录一下 获取微信支付之前 要先获取用户的基本信息哦 前端使用uniapp开发的H5 小伙伴们可以照着改一下对应语法 首先来个微信支付的工具类 wxApi js 这里我放到了项目下的common目录下 代码如下 微信
  • Vue控制台警告: Added non-passive event listener to a scroll-blocking ‘touchmove‘ event. Consider markin

    翻译过来如下 违反 没有添加被动事件监听器来阻止 touchstart 事件 请考虑添加事件管理者 passive 以使页面更加流畅 原因是 Chrome51 版本以后 Chrome 增加了新的事件捕获机制 Passive Event Li
  • 修改vscode默认打开两个标签窗口

    vscode 默认打开两个标签窗口 设置能同时打开多个标签 打开以下这个路径C Users xx AppData Roaming Code User 在setting json中添加一行设置 workbench editor enableP
  • android获取view宽高的时机

    关键点 获取宽高应该在view的onLayout之后 这个时候 view已经确定算出宽高 error 在onCreate onResume方法中调用 用于获取TextView的宽度和高度都是0 private void getTextHei