Android 等待view 加载布局完成 (包括动态生成View)

前言 

在实际开发中,有很多组件需要 根据数据,动态生成,或者 追加 / 减少 子view,由于View布局需要时间,此时想要获取父View的最新宽高值,要么手动测量,要么等待布局完成后再获取

ps:如果使用View树监听观察方法,只调用一次 也是拿不到父View最新值宽高值的。

    private boolean initFlag = false; // 初始化,确保只执行一次public BaseView(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {if (!initFlag) {fistInit();initFlag = true;}}});}// 只执行一次的方法public void fistInit() {}

1、案例:因为View布局间隔时间,导致当前父View宽高 和 布局完成后父View宽高不同

    @Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {super.onWindowFocusChanged(hasWindowFocus);LinearLayout testBox2 = (LinearLayout) findViewById(R.id.test_box);Log.d("TAG", "AAA getMeasuredHeight:" + testBox2.getMeasuredHeight());for (int i = 0; i < 2; i++) {TextView textView = new TextView(getContext());textView.setBackgroundColor(0x14F9230A);textView.setGravity(Gravity.CENTER);textView.setText("测试 -- 遍历生成的");testBox2.addView(textView);}Log.d("TAG", "BBB getMeasuredHeight:" + testBox2.getMeasuredHeight());new Handler().postDelayed(new Runnable() {@Overridepublic void run() {Log.d("TAG", "CCC getMeasuredHeight:" + testBox2.getMeasuredHeight());}}, 1000);}

2、解决方案

2.1 方式一:通过 通知系统重新测量,获取最新的值。
2.2 方式二:当前组件执行post方法,从主线程 重新获取值,post这种属于等待布局完成后 执行。

ps:方式一,是在View没有布局完成就可以拿到最新的值,获取值的速度最快;方式二,post 是等待View布局完成后 执行;根据业务需求自行选择。

    @Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {super.onWindowFocusChanged(hasWindowFocus);LinearLayout testBox2 = (LinearLayout) findViewById(R.id.test_box);Log.d("TAG", "AAA getMeasuredHeight:" + testBox2.getMeasuredHeight());for (int i = 0; i < 2; i++) {TextView textView = new TextView(getContext());textView.setBackgroundColor(0x14F9230A);textView.setGravity(Gravity.CENTER);textView.setText("测试 -- 遍历生成的");testBox2.addView(textView);}Log.d("TAG", "BBB getMeasuredHeight:" + testBox2.getMeasuredHeight());// 方式一:通过 通知系统重新测量,获取最新的值testBox2.measure(0, 0);Log.d("TAG", "CCC getMeasuredHeight:" + testBox2.getMeasuredHeight());// 方式二:当前组件执行post方法,从主线程 重新获取值,post这种属于等待布局完成后 执行testBox2.post(new Runnable() {@Overridepublic void run() {Log.d("TAG", "DDD getMeasuredHeight:" + testBox2.getMeasuredHeight());}});// 或者 从根视图也可以// getRootView().post(new Runnable() {//    @Override//    public void run() {//        Log.d("TAG", "DDD getMeasuredHeight:" + testBox2.getMeasuredHeight());//    }// });new Handler().postDelayed(new Runnable() {@Overridepublic void run() {Log.d("TAG", "EEE getMeasuredHeight:" + testBox2.getMeasuredHeight());}}, 1000);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“天作之合”softmax与CrossEntropy

本文从 max \text{max} max到 logsumexp ⁡ \operatorname{logsumexp} logsumexp&#xff0c;再到 softmax \text{softmax} softmax进行了一个简单推导&#xff0c;最后说明了 softmax \text{softmax} softmax与CrossEntropy的关系。希望帮助大家理解多分类损失函数CrossEntrop…

树莓派学习:学习opencv+用opencv获取树莓派mjpg摄像头视频流

目录 前提步骤 打开树莓派摄像头 查看是否有图像&#xff0c;登录游览器打开树莓派IP地址的8080端口 获取mjpg的视频流url 代码 先设定好mjpg的视频流的url 利用opencv库中的v2.VideoCapture类读取mjpg视频流 cv2.VideoCapture() 检查摄像头是否成功打开&#xff0c;…

scikit-learn实现线性回归

要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归&#xff0c;然后再有监督学习中找到线性模型 scikit-learn实现简单的线性回归 公式&#xff1a; L2范数是指向量中每个元素的平…

Java+Swing: 主界面的窗体 整理8

主界面的写法跟之前登录界面的窗体写法大致相同&#xff0c;在主界面中主要是窗体的大小的设置 package com.student_view;import com.utils.DimensionUtil; import sun.applet.Main;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author&#xff1a;xie…

C# --线程的进化史

1.C# 线程的进化史可以追溯到 .NET Framework 的早期版本和 C# 语言的发展过程 Thread 类&#xff08;.NET Framework 1.0&#xff09;&#xff1a;最初&#xff0c;C# 中使用 Thread 类来创建和管理线程。通过实例化 Thread 类并调用其 Start 方法&#xff0c;可以在应用程序…

全面覆盖,无所不包:C++ 编程必备指南 | 开源日报 No.99

fffaraz/awesome-cpp Stars: 51.0k License: MIT 这个项目是一个精心策划的 C(或者 C) 框架、库、资源和其他有趣东西的列表。它收集了各种标准库&#xff0c;如 STL 容器和算法&#xff1b;不同领域的框架&#xff0c;比如人工智能、异步事件循环等&#xff1b;以及一系列功…

【人工智能Ⅰ】实验7:K-means聚类实验

实验7 K-means聚类实验 一、实验目的 学习K-means算法基本原理&#xff0c;实现Iris数据聚类。 二、实验内容 应用K-means算法对iris数据集进行聚类。 三、实验结果及分析 0&#xff1a;输出数据集的基本信息 参考代码在main函数中首先打印了数据、特征名字、目标值、目标…

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关&#xff0c;它是一种多路输入单路输出的组合逻…

HHDESK右键管理简介

在HHDESK管理文件&#xff0c;除了基本的打开、删除、复制、粘贴、重命名外&#xff0c;还有多种便捷编辑方式。 可以分别以下列模式打开文档&#xff1a; 文本模式即是以文本编辑器打开文档。 1 二进制模式 可进行二进制编辑。 2 JSON模式 可对JSON文件进行直观的解析…

机器学习中的特征工程

1 特征工程概述 特征工程是机器学习中的一个关键步骤&#xff0c;在机器学习领域中占有非常重要的地位&#xff0c;是机器学习中不可或缺的一部分&#xff0c;下图展示了一个常规的机器学习流程&#xff1a; 特征工程涉及从原始数据中提取、选择和转换特征&#xff0c;以改善模…

Lombok 处理异常@SneakyThrows 注解

文章目录 注解的介绍具体示例 注解的介绍 SneakyThrows 是 Lombok 框架提供的一个注解&#xff0c;它可以用于在方法中抛出受检异常时&#xff0c;不用显式地对异常进行处理&#xff0c;而是将异常包装成 RuntimeException 抛出 使用 SneakyThrows 注解后&#xff0c;编译器会…

“轻松管理文件,一键导出表格,让您的归档工作井井有条“

在忙碌的工作中&#xff0c;我们经常会被大量的文件和数据所困扰。如何有效地管理和整理这些资料&#xff0c;成为了一个让人头疼的问题。今天&#xff0c;我们向您介绍一款强大的文件管理工具——一键导出表格&#xff0c;帮助您轻松解决这个问题。 第一步&#xff0c;首先我们…

区块链实验室(30) - 区块链期刊:Distributed Ledger Technologies: Research and Practice

区块链涉及多学科及技术&#xff0c;众多期刊接收区块链文章。Distributed Ledger Technologies: Research and Practice是ACM出版集团的一本期刊。 Distributed Ledger Technologies: Research and Practice创刊历史很短&#xff0c;始于2022年&#xff0c;出版期数也不多。 载…

力扣面试150题 | 多数元素

力扣面试150题 &#xff5c; 多数元素 题目描述解题思路代码实现 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示…

Leetcode 剑指 Offer II 056. 两数之和 IV - 输入二叉搜索树

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉…

Java 使用oshi获取当前服务器状态cpu、内存、存储等核心信息

文章目录 简介相关资料maven依赖oshi-官方示例获取CUP信息代码获取内存信息获取磁盘信息 简介 OSHI 是基于 JNA 的&#xff08;本地&#xff09;操作系统和硬件信息库。它不需要安装任何其他额外的本地库&#xff0c;旨在提供一种跨平台的实现来检索系统信息&#xff0c;例如操…

[ROS2] --- action

1 action介绍 ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以很好理解这个概念的含义&#xff0c;这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 1.1 客户端/服务器模型 动作和服务类似&#xff0c;使用的也是客户端和服务器模型&#xf…

数据结构中处理散列冲突的四种方法

1 开放定址法 1.1 定义 开放定址法就是一旦发生了冲突&#xff0c;就去寻找下一个空的散列地址 1.2 要求 只要散列表足够大 空的散列地址总能找到&#xff0c;并将记录存入 1.3 线性探测法 使用该公式用于解决冲突的开放定址法称为线性探测法 对于线性探测法&#xff0c…

【异常】SpringBoot3.2.0 Description: Failed to configure a DataSource: ‘url‘ att

mybatisPlus 多数据源导致 异常 Description:Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:If you want an embed…

通过kubeadm方式安装k8s

虚拟机最少是 2 core&#xff0c;master内存最小3G&#xff0c;node内存最小2G. 要求的Docker版本是18.03&#xff0c;如果不是安装的docker ce&#xff0c;版本是过旧的&#xff0c;可以选择删除后重新安装&#xff1b; 也可以重新创建一个虚拟机执行以下命令。 简单方法&am…