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