Activity 在 multi-window 模式下 window 尺寸为 2/3 时,方向改变时不会重新启动
Activity doesn't restart on orientation change when window size is 2/3 in multi-window mode
我在 multi-window 模式下遇到方向变化问题。
在平板设备中 window 大小为 2/3(在 multi-window 模式下)时,activity 不会在更改方向时重新启动。因此,我的布局看起来不合适。
当 window 尺寸是 multi window 模式下显示尺寸的 1/2 或 1/3 时,activity 在改变方向时正确重启。
我在带有 Oreo 和 Pie 图像的 (Android Studio) Emulator 中使用 Nexus 7 和 Pixel C 设备尝试并确认了这一点。
我的应用程序针对 Oreo 8.1,我没有在清单中使用 'android:configChanges' 或 'android:screenOrientation'。
请注意,2/3 window 尺寸不是正方形,屏幕尺寸在两个方向上都有微小变化,如果方向变化没有触发,那么屏幕尺寸变化应该触发 activity 重启。
重现步骤:
- 在平板设备上以调试模式启动应用程序。
- 在 onCreate 和 onResume 中放置断点。
- 将其置于多 window 模式(默认 1/2 大小)。
- 旋转设备并检查断点是否触发(它会触发)。
- 将 window 大小调整为 2/3。
- 旋转设备并检查断点是否触发(它没有!)。
我是否遗漏了导致此问题的原因?或者这是一个错误还是其他什么?在这种情况下,如何让我的 activity 重新启动?
一个有趣的问题,我从来不知道方向变化过程也有例外。我能够使用 Pixel C 模拟器 (Android 8.1) 和针对 API 级别 26 的应用重现该问题。
我想你的屏幕不仅仅是另一个列表,因为在这种情况下,12 像素的差异(1688 与 1676,如果我可以信任 LayoutInspector)无关紧要,所以我想添加一个观察结果可能有帮助:
我的应用程序包含自定义 View
,从日志中我可以看到它的方法 onMeasure()
和 onLayout()
被调用,即使 Activity
的onCreate()
不是。所以这是您可以介入并进行一些微调的地方。
另一种选择是强制重新创建 Activity
。您可以在检测到屏幕尺寸发生变化后立即调用 Activity
方法 recreate()
(已记录 here)。要跟踪屏幕尺寸的变化,您可以创建自定义 ViewGroup
覆盖 onLayout()
并将其用作 Activity
布局文件的根。
我在 multi-window 模式下遇到方向变化问题。 在平板设备中 window 大小为 2/3(在 multi-window 模式下)时,activity 不会在更改方向时重新启动。因此,我的布局看起来不合适。
当 window 尺寸是 multi window 模式下显示尺寸的 1/2 或 1/3 时,activity 在改变方向时正确重启。 我在带有 Oreo 和 Pie 图像的 (Android Studio) Emulator 中使用 Nexus 7 和 Pixel C 设备尝试并确认了这一点。
我的应用程序针对 Oreo 8.1,我没有在清单中使用 'android:configChanges' 或 'android:screenOrientation'。
请注意,2/3 window 尺寸不是正方形,屏幕尺寸在两个方向上都有微小变化,如果方向变化没有触发,那么屏幕尺寸变化应该触发 activity 重启。
重现步骤:
- 在平板设备上以调试模式启动应用程序。
- 在 onCreate 和 onResume 中放置断点。
- 将其置于多 window 模式(默认 1/2 大小)。
- 旋转设备并检查断点是否触发(它会触发)。
- 将 window 大小调整为 2/3。
- 旋转设备并检查断点是否触发(它没有!)。
我是否遗漏了导致此问题的原因?或者这是一个错误还是其他什么?在这种情况下,如何让我的 activity 重新启动?
一个有趣的问题,我从来不知道方向变化过程也有例外。我能够使用 Pixel C 模拟器 (Android 8.1) 和针对 API 级别 26 的应用重现该问题。
我想你的屏幕不仅仅是另一个列表,因为在这种情况下,12 像素的差异(1688 与 1676,如果我可以信任 LayoutInspector)无关紧要,所以我想添加一个观察结果可能有帮助:
我的应用程序包含自定义 View
,从日志中我可以看到它的方法 onMeasure()
和 onLayout()
被调用,即使 Activity
的onCreate()
不是。所以这是您可以介入并进行一些微调的地方。
另一种选择是强制重新创建 Activity
。您可以在检测到屏幕尺寸发生变化后立即调用 Activity
方法 recreate()
(已记录 here)。要跟踪屏幕尺寸的变化,您可以创建自定义 ViewGroup
覆盖 onLayout()
并将其用作 Activity
布局文件的根。