当前位置: 首页 > article >正文

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() {
            @Override
            public void onGlobalLayout() {
                if (!initFlag) {
                    fistInit();
                    initFlag = true;
                }
            }
        });
    }

    // 只执行一次的方法
    public void fistInit() {}

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

    @Override
    public 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() {
            @Override
            public void run() {
                Log.d("TAG", "CCC getMeasuredHeight:" + testBox2.getMeasuredHeight());
            }
        }, 1000);

    }

2、解决方案

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

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

    @Override
    public 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() {
            @Override
            public 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() {
            @Override
            public void run() {
                Log.d("TAG", "EEE getMeasuredHeight:" + testBox2.getMeasuredHeight());
            }
        }, 1000);

    }


http://www.kler.cn/news/163250.html

相关文章:

  • CCF 202104-2:邻域均值--C++
  • vue文件下载
  • 互联网数据传输原理 |OSI七层网络参考模型
  • WMS条码扫描管理:实现仓库管理的高效与精准
  • 【RabbitMQ基础编程模型】
  • 十六、FreeRTOS之FreeRTOS队列集
  • 数据中心:保障企业运营安全可靠的关键
  • 深入浅出之中央空调体系架构及楼宇自控系统
  • 找重复的数据(一维数组)
  • NLP项目实战01之电影评论分类
  • 目标检测YOLO实战应用案例100讲-交通场景中基于深度学习的目标检测和深度估计
  • FolkMQ 内存型消息中间件,v1.0.18 发布
  • 腾讯云CentOS8 jenkins war安装jenkins步骤文档
  • android快速网络请求之android-networking
  • 【Vue3+Ts项目】硅谷甄选 — 路由配置+登录模块+layout组件+路由鉴权
  • 计算机的存储规则
  • webpack该如何打包
  • 左值、右值 、左值引用、右值引用的总结
  • 【数据结构】顺序表的定义和运算
  • 苹果手机video标签播放视频问题(播放mp4视频遇到的坑)
  • WPS论文写作——公式和公式序号格式化
  • 文本转图像 学习笔记
  • web前端开发html/css练习
  • 第75讲:MySQL数据库MVCC多版本并发控制核心概念以及底层原理
  • 无人机高空巡查+智能视频监控技术,打造森林防火智慧方案
  • 结构化布线系统
  • 树莓派 5 - Raspberry Pi 5 入门教程
  • C/C++——内存管理
  • 微软NativeApi-NtQuerySystemInformation
  • 【WPF.NET开发】WPF中的对话框