android - 自定义 ViewGroup 中的 View 在大小更改后未呈现

标签 android resize rendering custom-view viewgroup

我遇到了一个让我很困惑的问题,我希望有人能给我一些建议。

我正在开发一个使用自定义 ViewGroup(实际上是包含 RelativeLayout 的 FrameLayout)来呈现事件日历的应用程序。日历中的事件表示为根据事件的持续时间和包含 View 的大小调整大小的 View 。

我遇到了在调整包含 FrameLayout 大小时出现的问题。当前的实现删除了所有代表事件的 View ,并尝试添加新的 View 并根据 FrameLayout 的当前大小计算它们的大小。这项工作是通过 View 的 onSizeChanged() 方法触发的,该方法在 FrameLayout 中被覆盖。

当调整 View 大小时,会执行此代码并更新 View ,但是,它们都不会真正呈现在屏幕上...... FrameLayout 中包含的 View 根本不可见。如果我在层次结构查看器工具中加载 View ,它们是 View 树的一部分,并在概述中它们应该在的位置上概述,但它们不显示。 (请注意, View 在 FrameLayout 的初始渲染中是可见的……只有在调整大小后它们才会消失。)

看来resize期间的事件顺序如下:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()

重置 View (在 onSizeChanged() 内部)后调用 requestLayout() 似乎没有效果。但是,如果我在调用 requestLayout() 之前造成一些延迟, View 就会变得可见。我可以通过产生一个线程并休眠来导致这种延迟,或者通过创建一个简单地调用 requestLayout() 并在自己调整大小后按下它的虚拟按钮,或者甚至是放在 onSizeChanged() 末尾的这个丑陋的黑客:

post(new Runnable() {
    public void run() {
        requestLayout();
    }
});

当我使用这个 hack 时,包含的 View 是可见的,并且事件的顺序如下:

onMeasure()
onMeasure()
onSizeChanged()
onLayout()
onMeasure()
onMeasure()
onLayout()

因此,似乎强制第二次测量通过(在修改 View 树之后)会使包含的 View 按应有的方式可见。为什么延迟对 requestLayout() 的调用对我来说是个谜。

谁能指出我做错了什么?

我意识到如果不看一些代码就很难理解,所以我创建了一个小示例应用程序来展示我的问题并在 Github 上提供:

https://github.com/MichaelSims/ViewGroupResizeTest

我上面提到的 hack 提交到一个单独的分支:

https://github.com/MichaelSims/ViewGroupResizeTest/tree/post-runnable-hack

如果我可以提供任何其他信息,请提前告诉我并感谢。

最佳答案

这不是 hack,它应该是这样工作的。 onSizeChanged() 作为布局传递的一部分被调用,您不能/不应该在布局传递期间 requestLayout()。在事件队列上发布 requestLayout() 以表明您在布局传递期间更改了 View 层次结构是正确的。

关于android - 自定义 ViewGroup 中的 View 在大小更改后未呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852758/

相关文章:

Android:隐藏键盘并在微调器关闭后再次显示

actionscript-3 - AIR - 按比例调整 native 窗口大小

html - 从 500x500 大小的 div 中的字符串呈现 HTML

CSS 性能 - 分组还是不分组?

java - Firestore whereEqualTo、orderBy 和 limit(1) 不起作用

android wifi状态随广播接收器改变

android - 在 Android 中导入包,但不在 IOS 中为 Flutter 应用导入包

java - 在 Java 中创建缩略图

cocoa - 如何为 NSWindow 编写自己的调整大小角/句柄?

html - IE 8.0 和 Chrome 表单格式问题