【发布时间】:2017-05-16 18:45:03
【问题描述】:
我有一个在水平滚动窗口中按列显示文本和图像的视图。它重排,因此(至少可能)随着内容的变化而调整自己的大小;当软键盘来来去去以及视图高度发生变化时,它也会重新排列和调整大小(保持大致恒定的区域)。
我发现大多数时候调用 requestLayout() 有效(从某种意义上说,它确实触发了对我的 onMeasure() 重载的调用)......但是当从我的onSizeChanged() 处理程序。
我能够通过 post() 调用 requestLayout() 的 Runnable 然后 post()ed 另一个 Runnable 调用我需要在 onMeasure() 之后运行的代码来解决此问题...但这似乎有点脆弱(我不想增加延迟,但我确实想确保我的第二个Runnable 确实在异步onMeasure() 之后执行)并且,也许是因为它通过了很多次事件循环,屏幕闪烁太多。
是否有某种方式 - 在 onSizeChanged() 中 - 强制 onMeasure()(可能还有另一个 onSizeChanged())在下一个 onDraw() 之前发生?
【问题讨论】:
-
而不是第二次调用
requestLayout()(它在onSizeChanged()中不起作用,因为这个回调是布局过程的一部分)你为什么不简单地在@ 中计算正确的大小987654338@? -
我愿意,而且行得通。但是当高度发生变化时,我会重排——这会改变宽度——因此需要触发对
onMeasure()的调用。 -
您的问题实际上为我刚刚遇到的问题提供了答案,谢谢 :) 您的 View.post 解决方案对我没有任何副作用。谢谢!
-
关于您的问题:为什么不从 onMeasure 方法内部调用第二个 Runnable 中的代码?
-
它不仅来自 onSizeChanged,它不起作用。我尝试从我的 setImageDrawable 方法调用 requestLayout 以导致 onMeasure 并且它不起作用。发布它虽然修复了它。