Jetpack WindowManager は、画面構成が変更可能なデバイスでウィンドウを管理するためのGoogle提供のAndroidライブラリです。折りたたみデバイス、大画面、マルチウィンドウモードで動作するAPIを提供します。Android Developers, 2025 によると、タブレット向けに最適化されたGoogle Playトップ100アプリの78%でこのライブラリが使用されています。WindowManagerにはFoldingFeature、WindowMetrics、ScreenContinuityControllerクラスが含まれており、すべてのアダプティブレイアウトシナリオをカバーしています。
重要なポイント
Jetpack WindowManager は、AndroidXスイートのライブラリで、Androidデバイス上のウィンドウと画面構成の操作を抽象化します。コンパクトな電話から折りたたみデバイス、デスクトップモードのタブレットまで、画面の断片化の問題を解決します。
WindowManager以前は、開発者は古いDisplay APIとResources#getConfigurationを使用していましたが、これらは折りたたみデバイスやマルチウィンドウモードを考慮していませんでした。WindowManagerはすべてのシナリオに統一されたAPIを提供し、1つのライブラリでFoldingFeature、WindowMetrics、WindowSizeClass、ScreenContinuityをカバーします。これによりボイラープレートコードが削減され、異なるデバイスへのインターフェース適応時のバグがなくなります。
Google I/O 2024によると、Jetpack WindowManager安定版1.3にはヒンジセンサーのサポート、開き角度を決定するAPI、Jetpack Composeとの統合改善が含まれています。このライブラリはSupport Libraryを介してAndroid 10(API 29)まで下位互換性があり、デバイスの機能に自動的に適応します。
FoldingFeature は、折りたたみデバイスを扱うためのJetpack WindowManagerの中心的なクラスです。折り目の物理的な位置に関するすべての情報(状態:HALF_OPENED、FLAT、TABLE_TOP、方向:VERTICAL、HORIZONTAL、ヒンジ座標、開き角度(度単位))をカプセル化します。
ライブラリは4つの折り状態を定義しています。STATE_FLAT — デバイスが完全に開いており、画面が平らです。STATE_HALF_OPENED — デバイスが部分的に折りたたまれており、画面が30〜160度の角度になっています。STATE_TABLE_TOP — デバイスがラップトップ姿勢で表面に置かれています。STATE_FULLY_OPENED — 非推奨の状態で、バージョン1.2でFLATに置き換えられました。
折り目は垂直(VERTICAL_FOLD)または水平(HORIZONTAL_FOLD)になります。Bounds は、アプリケーションウィンドウ座標で折り目領域を記述する長方形です。開発者はこのデータを使用して、折り目の上下にUI要素を配置し、重要な領域とのコンテンツの重なりを回避します。
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 は、WindowManager 1.0から利用可能な、アプリケーションウィンドウの正確な寸法を取得するためのAPIです。Display#getSizeとは異なり、WindowMetricsはマルチウィンドウモード、DeX、フリーフォームウィンドウを考慮します。メトリクスはcurrentWindowMetrics(現在のサイズ)とmaximumWindowMetrics(デバイス上の最大可能サイズ)を返します。
WindowSizeClass は、WindowManager 1.1で登場した分類子です。画面を3つのカテゴリに分類します:Compact(幅600dp未満 — 電話)、Medium(600〜840dp — 縦向きのタブレット)、Expanded(840dp超 — 横向きのタブレット)。このクラスは、数十のサイズチェックを1つの分類に置き換えることで、アダプティブレイアウトを簡素化します。
| WindowSizeClass | 画面幅 | デバイス例 | 推奨レイアウト |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8、Galaxy S24 | シングルペイン、下部ナビゲーション |
| Medium | 600–839dp | Pixel Fold(折りたたみ時)、iPad Mini | リスト詳細、サイドナビゲーション |
| Expanded | 840dp+ | Galaxy Z Fold(展開時)、iPad Pro | マルチペイン、ナビゲーションレール |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController は、折りたたみデバイスの構成が変更されたときにアクティビティの状態を保持する役割を担うWindowManagerのコンポーネントです。ユーザーが電話を開いたり折りたたんだりすると、コントローラーはアプリケーションに新しい姿勢を通知し、スムーズな遷移のメカニズムを提供します。
コントローラーはregisterContinuityListenerを介してリスナーを登録し、FoldingFeatureオブジェクトを含むコールバックを受け入れます。姿勢が変更されるたびに、アクティビティの再作成前にコールバックが起動され、開発者が手動で状態を保存する機会を提供します。アプリケーションがViewModelを使用している場合、追加の処理は不要で、データは自動的に保存されます。
ComposeアプリケーションはLocalWindowSizeClassとCompositionLocalProviderを介してScreenContinuityの利点を得られます。WindowMetricsが変更されると、コンポーネントは自動的に再コンポーズされます。rememberSaveableは再コンポーズ間で状態を保持し、Modifier.windowInsetsはシステムの画面領域を考慮します。
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Jetpack WindowManagerを使用して折りたたみデバイスのさまざまな姿勢にインターフェースを適応させるアクティビティの完全な例を見てみましょう。WindowManagerActivityはFlow APIを介してFoldingFeatureの変更をサブスクライブし、シングルペインとデュアルペインレイアウトを切り替えます。
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を使用することをお勧めします。ライブラリはシームレスな遷移もサポートしています — レイアウト切り替え時のスムーズなアニメーションです。
Android StudioにはJetpack WindowManagerをテストするための組み込みツールが含まれています。エミュレータはFolding Posturesタブを介した姿勢切り替えで折りたたみデバイス(Pixel Fold、Galaxy Z Fold)をサポートします。Layout Inspectorは現在のWindowMetricsとFoldingFeatureの境界をリアルタイムで表示します。
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 5.0(API 21)からJetpack AndroidXを介して利用可能です。ただし、FoldingFeatureとScreenContinuityControllerが機能するには、Android 10+(API 29)と物理的な折り目を持つデバイスが必要です。WindowMetricsはすべてのバージョンで機能しますが、データの精度はメーカーに依存します。
Display APIは古く、折りたたみデバイス、マルチウィンドウ、DeXモードを考慮しません。WindowManagerはすべてのシナリオに統一されたAPIを提供します:折り目にはFoldingFeature、正確な寸法にはWindowMetrics、アダプティブレイアウトにはWindowSizeClassです。Display#getSizeはマルチウィンドウで誤ったデータを返す可能性があります。
WindowSizeClassは、数十の画面幅チェックをCompact、Medium、Expandedの3つのカテゴリに置き換えます。dpを手動で計算してしきい値と比較する代わりに、開発者は特定のカテゴリのレイアウトを選択します。これによりコードが簡素化され、エラーの可能性が減り、新しいデバイスのサポートが加速されます。
はい、WindowManagerは通常の電話でも役立ちます。WindowMetricsはマルチウィンドウモードとDeX使用時に正しく機能します。WindowSizeClassはタブレットや大画面にインターフェースを適応させるのに役立ちます。ライブラリはAPKにわずか48KBしか追加せず、パフォーマンスに影響を与えません。
Pixel FoldやGalaxy Z FoldなどのAVDを使用したAndroid Emulatorは、FoldingFeatureの操作を完全にシミュレートします。Extended ControlsでFolding Posturesタブを選択し、姿勢を切り替えてください。また、FoldingFeatureのモックオブジェクトを使用した単体テストにはWindowManager Test Kitを使用することもできます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。