您的應用程式在縱向模式作業出色,因此您已將應用程式設為僅限縱向顯示。然而您卻發現,在橫向的大螢幕上還能完成更多操作。
那麼,這兩者要如何兼顧呢?是否可以限制應用程式在小螢幕上以縱向模式顯示,但在大螢幕上啟用橫向模式?
最佳做法
最好的應用程式會尊重使用者的偏好,例如裝置的螢幕方向。
自動調整應用程式品質指南建議應用程式支援所有裝置設定,包括直向和橫向模式、多視窗模式,以及摺疊式裝置摺疊與展開的狀態。應用程式應針對不同的設定來最佳化版面配置和使用者介面,並且在設定變更時儲存及還原狀態。
這個方案是暫時性措施,只能提供些微大螢幕支援。您可使用這個方案改善應用程式,直到能完整支援所有裝置設定。
要件
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 在設定變更時更新活動的方向。
如果螢幕寬度或高度小於 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) 區塊中,即可在每次應用程式設定變更時 (例如調整活動大小、在螢幕間移動,或摺疊式裝置摺疊/展開後),主動覆寫螢幕方向設定。
如要進一步瞭解發生設定變更的時間,以及導致活動重新建立的時間,請參閱「處理設定變更」。
結果
現在即使裝置旋轉時,您的應用程式仍應在小螢幕上以縱向顯示。在大螢幕上,應用程式應支援橫向和直向。
其他資源
如需升級應用程式以隨時支援所有裝置設定的說明,請參閱以下內容: