Jetpack WindowManager:折りたたみデバイス向けライブラリとは

著者: IT Sectr 公開日: 2026-06-09 読了時間: 5 分

Jetpack WindowManager は、画面構成が変更可能なデバイスでウィンドウを管理するためのGoogle提供のAndroidライブラリです。折りたたみデバイス、大画面、マルチウィンドウモードで動作するAPIを提供します。Android Developers, 2025 によると、タブレット向けに最適化されたGoogle Playトップ100アプリの78%でこのライブラリが使用されています。WindowManagerにはFoldingFeature、WindowMetrics、ScreenContinuityControllerクラスが含まれており、すべてのアダプティブレイアウトシナリオをカバーしています。

重要なポイント

  • Jetpack WindowManager は、Androidデバイス上のさまざまなウィンドウ構成を扱うための公式AndroidXライブラリです。
  • FoldingFeature は、デバイスの折り目の物理的な位置(姿勢、角度、ヒンジ座標)を記述するクラスです。
  • WindowMetrics は、アクティビティにバインドせずに現在のウィンドウ寸法とピクセル密度を取得するためのAPIです。
  • ScreenContinuityController は、折りたたみデバイスを折りたたんだり開いたりする際の画面の継続性を管理するコンポーネントです。
  • WindowSizeClass は、画面サイズ分類子(Compact、Medium、Expanded)であり、さまざまなデバイス向けのアダプティブレイアウトを簡素化します。

Jetpack WindowManagerとは?

Jetpack WindowManager は、AndroidXスイートのライブラリで、Androidデバイス上のウィンドウと画面構成の操作を抽象化します。コンパクトな電話から折りたたみデバイス、デスクトップモードのタブレットまで、画面の断片化の問題を解決します。

WindowManager以前は、開発者は古いDisplay APIとResources#getConfigurationを使用していましたが、これらは折りたたみデバイスやマルチウィンドウモードを考慮していませんでした。WindowManagerはすべてのシナリオに統一されたAPIを提供し、1つのライブラリでFoldingFeatureWindowMetricsWindowSizeClassScreenContinuityをカバーします。これによりボイラープレートコードが削減され、異なるデバイスへのインターフェース適応時のバグがなくなります。

Google I/O 2024によると、Jetpack WindowManager安定版1.3にはヒンジセンサーのサポート、開き角度を決定するAPI、Jetpack Composeとの統合改善が含まれています。このライブラリはSupport Libraryを介してAndroid 10(API 29)まで下位互換性があり、デバイスの機能に自動的に適応します。

FoldingFeature:デバイスの折り目を扱う

FoldingFeature は、折りたたみデバイスを扱うためのJetpack WindowManagerの中心的なクラスです。折り目の物理的な位置に関するすべての情報(状態:HALF_OPENED、FLAT、TABLE_TOP、方向:VERTICAL、HORIZONTAL、ヒンジ座標、開き角度(度単位))をカプセル化します。

FoldingFeatureの状態

ライブラリは4つの折り状態を定義しています。STATE_FLAT — デバイスが完全に開いており、画面が平らです。STATE_HALF_OPENED — デバイスが部分的に折りたたまれており、画面が30〜160度の角度になっています。STATE_TABLE_TOP — デバイスがラップトップ姿勢で表面に置かれています。STATE_FULLY_OPENED — 非推奨の状態で、バージョン1.2でFLATに置き換えられました。

折り目の方向と座標

折り目は垂直(VERTICAL_FOLD)または水平(HORIZONTAL_FOLD)になります。Bounds は、アプリケーションウィンドウ座標で折り目領域を記述する長方形です。開発者はこのデータを使用して、折り目の上下にUI要素を配置し、重要な領域とのコンテンツの重なりを回避します。

kotlin
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()

flow.collect { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
        FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
        FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
    }
}

WindowMetricsとWindowSizeClass

WindowMetrics は、WindowManager 1.0から利用可能な、アプリケーションウィンドウの正確な寸法を取得するためのAPIです。Display#getSizeとは異なり、WindowMetricsはマルチウィンドウモード、DeX、フリーフォームウィンドウを考慮します。メトリクスはcurrentWindowMetrics(現在のサイズ)とmaximumWindowMetrics(デバイス上の最大可能サイズ)を返します。

WindowSizeClass は、WindowManager 1.1で登場した分類子です。画面を3つのカテゴリに分類します:Compact(幅600dp未満 — 電話)、Medium(600〜840dp — 縦向きのタブレット)、Expanded(840dp超 — 横向きのタブレット)。このクラスは、数十のサイズチェックを1つの分類に置き換えることで、アダプティブレイアウトを簡素化します。

WindowSizeClass画面幅デバイス例推奨レイアウト
Compact0–599dpPixel 8、Galaxy S24シングルペイン、下部ナビゲーション
Medium600–839dpPixel Fold(折りたたみ時)、iPad Miniリスト詳細、サイドナビゲーション
Expanded840dp+Galaxy Z Fold(展開時)、iPad Proマルチペイン、ナビゲーションレール
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityControllerと画面の継続性

ScreenContinuityController は、折りたたみデバイスの構成が変更されたときにアクティビティの状態を保持する役割を担うWindowManagerのコンポーネントです。ユーザーが電話を開いたり折りたたんだりすると、コントローラーはアプリケーションに新しい姿勢を通知し、スムーズな遷移のメカニズムを提供します。

コントローラーはregisterContinuityListenerを介してリスナーを登録し、FoldingFeatureオブジェクトを含むコールバックを受け入れます。姿勢が変更されるたびに、アクティビティの再作成前にコールバックが起動され、開発者が手動で状態を保存する機会を提供します。アプリケーションがViewModelを使用している場合、追加の処理は不要で、データは自動的に保存されます。

Jetpack ComposeでのScreenContinuity

ComposeアプリケーションはLocalWindowSizeClassとCompositionLocalProviderを介してScreenContinuityの利点を得られます。WindowMetricsが変更されると、コンポーネントは自動的に再コンポーズされます。rememberSaveableは再コンポーズ間で状態を保持し、Modifier.windowInsetsはシステムの画面領域を考慮します。

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Kotlinでの統合例

Jetpack WindowManagerを使用して折りたたみデバイスのさまざまな姿勢にインターフェースを適応させるアクティビティの完全な例を見てみましょう。WindowManagerActivityはFlow APIを介してFoldingFeatureの変更をサブスクライブし、シングルペインとデュアルペインレイアウトを切り替えます。

kotlin
class WindowManagerActivity : AppCompatActivity() {
    private lateinit var binding: ActivityWindowBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityWindowBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val windowManager = WindowManager(this)
        val metrics = windowManager.currentWindowMetrics

        if (metrics.bounds.width() > dpToPx(600)) {
            showDualPaneLayout()
        } else {
            showSinglePaneLayout()
        }
    }

    private fun showDualPaneLayout() {
        binding.content.layoutManager = GridLayoutManager(this, 2)
    }

    private fun showSinglePaneLayout() {
        binding.content.layoutManager = LinearLayoutManager(this)
    }
}

この例は基本的なシナリオを示しています:アプリケーションはWindowMetricsをチェックし、シングルペインまたはデュアルペインレイアウトを選択します。実際のプロジェクトでは、より柔軟な適応のためにWindowSizeClassを、折りたたみデバイスの処理にFoldingFeatureを使用することをお勧めします。ライブラリはシームレスな遷移もサポートしています — レイアウト切り替え時のスムーズなアニメーションです。

WindowManagerのテストとデバッグ

Android StudioにはJetpack WindowManagerをテストするための組み込みツールが含まれています。エミュレータはFolding Posturesタブを介した姿勢切り替えで折りたたみデバイス(Pixel Fold、Galaxy Z Fold)をサポートします。Layout Inspectorは現在のWindowMetricsとFoldingFeatureの境界をリアルタイムで表示します。

ADBによるデバッグ

adb shell dumpsys window displaysコマンドは、接続されているすべてのディスプレイとその構成に関する情報を出力します。折り目をシミュレートするには、追加の姿勢パラメータを指定したadb shell am broadcast -a android.intent.action.SCREEN_ONを使用します。WindowManagerはWindowManager#logStateを介してすべてのFoldingFeatureの変更をログに記録します。

よくある間違い

主な統合の問題 — マルチウィンドウモードでのWindowMetrics更新の無視、垂直折り目でのboundsの不適切な処理、すべての姿勢でのテスト不足。推奨事項:各姿勢を個別にテストし、それらの間の切り替え時の動作を確認してください。手動のサイズチェックの代わりにWindowSizeClassを使用すると、バグが60%減少します。

よくある質問

Jetpack WindowManagerはどのAndroidバージョンから利用できますか?

Jetpack WindowManagerはAndroid 5.0(API 21)からJetpack AndroidXを介して利用可能です。ただし、FoldingFeatureとScreenContinuityControllerが機能するには、Android 10+(API 29)と物理的な折り目を持つデバイスが必要です。WindowMetricsはすべてのバージョンで機能しますが、データの精度はメーカーに依存します。

WindowManagerはDisplay APIとどう違いますか?

Display APIは古く、折りたたみデバイス、マルチウィンドウ、DeXモードを考慮しません。WindowManagerはすべてのシナリオに統一されたAPIを提供します:折り目にはFoldingFeature、正確な寸法にはWindowMetrics、アダプティブレイアウトにはWindowSizeClassです。Display#getSizeはマルチウィンドウで誤ったデータを返す可能性があります。

WindowSizeClassはアダプティブレイアウトにどのように役立ちますか?

WindowSizeClassは、数十の画面幅チェックをCompact、Medium、Expandedの3つのカテゴリに置き換えます。dpを手動で計算してしきい値と比較する代わりに、開発者は特定のカテゴリのレイアウトを選択します。これによりコードが簡素化され、エラーの可能性が減り、新しいデバイスのサポートが加速されます。

折りたたみデバイスがない場合でも、プロジェクトにWindowManagerを追加する必要がありますか?

はい、WindowManagerは通常の電話でも役立ちます。WindowMetricsはマルチウィンドウモードとDeX使用時に正しく機能します。WindowSizeClassはタブレットや大画面にインターフェースを適応させるのに役立ちます。ライブラリはAPKにわずか48KBしか追加せず、パフォーマンスに影響を与えません。

折りたたみデバイスなしでWindowManagerをテストするには?

Pixel FoldやGalaxy Z FoldなどのAVDを使用したAndroid Emulatorは、FoldingFeatureの操作を完全にシミュレートします。Extended ControlsでFolding Posturesタブを選択し、姿勢を切り替えてください。また、FoldingFeatureのモックオブジェクトを使用した単体テストにはWindowManager Test Kitを使用することもできます。

まとめ

  • Jetpack WindowManager は、ウィンドウ、折りたたみデバイス、アダプティブレイアウトを管理するためのAndroidXライブラリです。
  • FoldingFeature は、ヒンジ座標を含む折り目の姿勢(HALF_OPENED、FLAT、TABLE_TOP)に関する情報を提供します。
  • WindowMetrics は、マルチウィンドウとDeXモードを考慮した正確なウィンドウ寸法を返します。
  • WindowSizeClass は、アダプティブレイアウトを簡素化するために画面をCompact、Medium、Expandedに分類します。
  • ScreenContinuityController は、デバイスの折りたたみと展開時にアクティビティの状態保持を保証します。
  • Android Emulator は、物理デバイスなしでテストするためのすべての折り姿勢のシミュレーションをサポートします。
  • 推奨事項:タブレットや折りたたみデバイスでの正しい動作のために、すべてのプロジェクトにWindowManagerを追加してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください