限制手機上應用程式的方向,而不限制大螢幕

兩星評等圖示

您的應用程式在縱向模式作業出色,因此您已將應用程式設為僅限縱向顯示。然而您卻發現,在橫向的大螢幕上還能完成更多操作。

那麼,這兩者要如何兼顧呢?是否可以限制應用程式在小螢幕上以縱向模式顯示,但在大螢幕上啟用橫向模式?

最佳做法

最好的應用程式會尊重使用者的偏好,例如裝置的螢幕方向。

自動調整式應用程式品質指南」建議應用程式支援所有裝置設定,包括縱向和橫向模式、多視窗模式,以及摺疊式裝置摺疊與展開的狀態。應用程式應針對不同的設定來最佳化版面配置和使用者介面,並且在設定變更時儲存及還原狀態。

這個方案是暫時性措施,只能提供些微大螢幕支援。您可使用這個方案改善應用程式,直到能完整支援所有裝置設定。

要件

  • screenOrientation:應用程式資訊清單設定,可讓您指定應用程式如何因應裝置螢幕方向變更
  • Activity#setRequestedOrientation():可在執行階段變更應用程式顯示方向的方法
  • LocalConfiguration:可組合的本機供應器,可公開目前的裝置 Configuration,讓您以 DP 為單位讀取螢幕尺寸。
  • LaunchedEffect:撰寫會在鍵值變更時 (在本例中為設定變更時) 執行程式碼區塊的 Compose 副效應 API。

步驟

允許應用程式依照應用程式資訊清單,依預設處理螢幕方向變更。 接著在執行階段,使用 Jetpack Compose 將螢幕方向動態限制為直向 (適用於手機等緊湊型螢幕),同時允許在大螢幕上使用所有方向。

1. 指定應用程式資訊清單中的方向設定

您可以選擇避免宣告應用程式資訊清單的 screenOrientation 元素 (這種情況下,螢幕方向預設為 unspecified),或是將螢幕方向設為 fullUser。如果使用者尚未鎖定以感應器為基礎的旋轉方式,您的應用程式將支援所有的裝置螢幕方向。

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

使用 unspecifiedfullUser 有細微但重要的差別。如果您未宣告 screenOrientation 值,系統會選擇螢幕方向,而系統用來定義螢幕方向的政策也會因裝置而異。另一方面,指定 fullUser 更符合使用者為裝置定義的行為:如果使用者已鎖定感應器旋轉功能,應用程式會遵循使用者偏好設定;否則,系統會允許使用四種可能的螢幕方向 (直向、橫向、反向直向或反向橫向)。請參閱「android:screenOrientation」。

2. 在 Compose 中動態限制螢幕方向

在 Jetpack Compose 中,您可以從 LocalConfiguration.current 以 DP 為單位,反應式地讀取目前的螢幕尺寸,並在設定變更時使用 LaunchedEffect 更新 Activity 的螢幕方向。

如果螢幕寬度或高度小於 600dp (對應於手機的緊湊型中斷點),請將螢幕方向限制為直向。否則,請允許系統根據使用者偏好設定 (unspecifiedfullUser) 旋轉應用程式。

以下是可編譯的完整實作:

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) 區塊中新增邏輯,即可在應用程式設定變更時,反應式地覆寫螢幕方向設定,例如調整活動大小、在螢幕間移動,或摺疊式裝置摺疊/展開後。

如要進一步瞭解發生設定變更的時間,以及導致活動重新建立的時間,請參閱「處理設定變更」。

結果

現在即使裝置旋轉時,您的應用程式仍應在小螢幕上以縱向顯示。在大螢幕上,應用程式應支援橫向和直向。

其他資源

如需升級應用程式以隨時支援所有裝置設定的說明,請參閱以下內容: