我的应用需要在布局完成后执行一些视图大小调整。它目前在onWindowFocusChanged()
中完成。
它在Windows 11上无法正常工作(使用Windows Subsystem for Android,WSA)。在手动调整窗口大小的过程中,Activity会被销毁并重新创建几次,但:
- 在调整大小过程中或调整大小之后,从不调用
onWindowFocusChanged()
- 在调整大小结束时不会重新创建“活动”,因此posting a runnable to the UI queue不是一个选项:此时视图的尺寸仍然是错误的。
我注意到切换WSA兼容性设置Disable smooth resize
实际上解决了这个问题:在调整大小的过程中什么也不发生,但是当调整大小结束时onWindowFocusChanged()
被调用。
是否可以通过编程方式强制执行此行为?
我不希望用户被迫更改此设置才能正常使用应用。
1条答案
按热度按时间omhiaaxx1#
我最终发现这个窗口大小调整问题并不是WSA特有的:当使用可自由调整大小的窗口时,常规Android设备和模拟器也会出现这种情况。
解决方案是停止依赖
onWindowFocusChanged()
来获得窗口大小更改的通知:这是一个不可靠黑客(见问题)。相反,我现在使用
OnGlobalLayoutListener
,如下所示:每次改变窗口大小时,游戏视图都会正确调整大小。
setDimensionsOfVariableViews()
实现了防止过度调整大小/布局和无限循环的基本保护(检查自上次调用以来大小是否发生了变化),因此我们从不删除侦听器。