您的应用在手机上的纵向模式下效果好,因此您将应用限制为仅限纵向显示。但是您发现,对于大屏设备而言,该应用在横向模式下或许可以实现更多优势。
如何同时兼顾两种场景?也就是说,如何让应用在小屏设备上仅可纵向显示,但在大屏设备上也可横向显示?
最佳做法
出色的应用会遵循用户偏好设置,例如设备屏幕方向设置。
自适应应用质量指南建议应用支持所有设备 配置,包括纵向和横向屏幕方向、多窗口 模式以及可折叠设备的折叠和展开状态。应用应针对不同的配置优化布局和界面,并且在配置发生更改时应保存及恢复状态。
此方案是一种临时性措施 - 提供些许的大屏幕支持。在您能够改进应用,使其针对所有设备配置提供全面支持之前,可以权且使用此方案。
所需要素
screenOrientation:应用清单设置,让您可以指定应用如何响应设备屏幕方向的变化Activity#setRequestedOrientation():用于在运行时更改应用屏幕方向的方法LocalConfiguration:可组合项本地提供程序,用于公开当前 设备的Configuration,让您可以读取屏幕尺寸(以 dp 为单位)。LaunchedEffect:Compose 副作用 API,用于在键发生变化时(在本例中,即配置发生变化时)运行代码块。
步骤
在应用清单中启用应用以默认处理屏幕方向变化。 然后,在运行时,使用 Jetpack Compose 将屏幕方向动态限制为在紧凑型屏幕(手机)上纵向显示,同时允许在大屏设备上显示所有屏幕方向。
1. 在应用清单中指定屏幕方向设置
您可以避免声明应用清单的 screenOrientation 元素(在这种情况下,屏幕方向默认设置为 unspecified),也可以将屏幕方向设置为 fullUser。如果用户没有锁定基于传感器的旋转,您的应用将支持所有设备屏幕方向。
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
使用 unspecified 和 fullUser 之间的区别虽然微不足道,但很重要。如果您未声明 screenOrientation
值,系统会选择屏幕方向,并且系统用于定义屏幕方向的政策可能会因设备而异。另一方面,指定 fullUser
与用户为设备定义的行为更相符:如果用户锁定了基于传感器的旋转,应用会遵循用户的偏好设置;否则,系统会允许设备处于四种可能的屏幕方向(纵向、横向、反向纵向或反向横向)中的任何一种。请参阅
android:screenOrientation。
2. 在 Compose 中动态限制屏幕方向
在 Jetpack Compose 中,您可以从 LocalConfiguration.current 中以响应方式读取当前屏幕尺寸(以 dp
为单位),并使用 LaunchedEffect 在配置发生变化时更新 activity 的屏幕方向。
如果屏幕宽度或高度小于 600dp(对应于手机的紧凑型断点),则将屏幕方向限制为纵向。否则,允许系统根据用户的偏好设置(unspecified 或 fullUser)旋转应用。
以下是完整的可编译实现:
val configuration = LocalConfiguration.current val context = LocalActivity.current LaunchedEffect(configuration) { val activity = context ?: return@LaunchedEffect // Determine if screen is compact (phone-sized) in either width or height val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600 activity.requestedOrientation = if (isCompact) { ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } else { ActivityInfo.SCREEN_ORIENTATION_FULL_USER } }
通过在 LaunchedEffect(configuration) 块内添加逻辑,您可以在应用配置发生变化时(例如 activity
调整大小、在不同显示屏之间移动或可折叠设备折叠或展开时)以响应方式替换屏幕方向设置。
如需详细了解何时配置会更改以及何时会导致 activity 重新创建,请参阅处理配置更改。
结果
现在,在小屏设备上,无论设备如何旋转,应用应该会始终保持纵向模式。在大屏设备上,该应用应支持横向模式和纵向模式。
其他资源
如果您希望升级应用以使其始终支持所有设备配置,并需要这方面的帮助,请参阅以下内容: