Window Size ClassはJetpack WindowManagerのAPIで、アプリケーションウィンドウをCompact、Medium、Expandedの3つのカテゴリに分類します。物理的な解像度やピクセル密度を確認する代わりに、クラスはdp単位で利用可能な幅を分析します——これにより、あらゆるデバイスで予測可能な結果が得られます。Android Developers Documentation (2025)によると、Window Size ClassはWindowManagerのおかげで、Jetpack ComposeおよびViewシステムにおけるアダプティブインターフェースの標準となっています。
重要なポイント
Window Size Classは、Jetpack WindowManagerライブラリに含まれるAndroidプラットフォームのAPIで、アプリケーションウィンドウの利用可能なスペースを3つのカテゴリに分類します。リソース修飾子(small/large/xlarge)を用いた従来のアプローチとは異なり、Window Size Classは開発者がインターフェースを設計する際に頼りにできる個別の値セットを提供します。
このAPIはマルチウィンドウモードのサポートの一環としてAndroid 7.0 Nougatで登場しましたが、活発な導入はJetpack WindowManager 1.1(2022年)から始まりました。GoogleはDisplay.getSize()による画面幅の確認ではなく、アダプティブレイアウト構築の主要ツールとしてWindow Size Classを推奨しています。
分類は物理的なサイズやピクセル密度ではなく、dp単位でのウィンドウ幅に基づいています。つまり、解像度は異なるがdp単位での幅が同じ2つのデバイスは同じクラスを受け取ります——インターフェースは予測どおりに同一になります。
Compact — 幅600 dpまでのウィンドウ向けのクラス。ポートレートモードのスマートフォン、折りたたみ状態のほとんどのフォルダブル端末(Galaxy Z Flip)。インターフェースは1カラムで構築され、ナビゲーションはBottom Navigationを使用。
Medium — 幅600〜840 dpのウィンドウ向けのクラス。ポートレートのタブレット、ランドスケープのスマートフォン、半開き状態のフォルダブル端末。インターフェースは2カラムを使用——例えば、左側にリスト、右側に詳細。Navigation RailがBottom Navigationを置き換えます。
Expanded — 幅840 dp以上のウィンドウ向けのクラス。ランドスケープのタブレット、デスクトップウィンドウ、展開状態のフォルダブル端末。インターフェースは3つ以上のパネル、Permanent Navigation Drawer、ツールパネルを使用できます。
Material Design 3では、各クラスに対してアダプティブコンポーネントが定義されています:MediumにはNavigation Rail、ExpandedにはNavigation Drawer、CompactにはBottom Navigation。開発者はブレークポイントを選択する必要はありません——それらはAPIによって既に定義されています。
Window Size Classは、システム要素——ステータスバー、ナビゲーションバー、Split Screenの画面分割——を考慮した上で、アプリケーションウィンドウの現在の幅(dp単位)に基づいて計算されます。APIはウィンドウ構成の変更(デバイスの回転、マルチウィンドウモードへの移行、フォルダブル端末の展開)時にトリガーされます。
クラスを取得するには、androidx.windowライブラリのWindowSizeClassクラスを使用します。開発者はFlow(Kotlin)またはLiveData(Java)を購読し、手動のonConfigurationChanged処理なしで、ウィンドウサイズが変更されるたびに自動的にクラスを更新します。
分類は3つのステップで行われます。第一に——現在のウィンドウ幅をピクセル単位で測定。第二に——DisplayMetrics.densityを介してdpに変換。第三に——取得した値をしきい値と比較:600 dp未満——Compact、600〜840——Medium、840以上——Expanded。
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()
when (windowSizeClass.windowWidthSizeClass) {
WindowWidthSizeClass.COMPACT -> // compact width
WindowWidthSizeClass.MEDIUM -> // medium width
WindowWidthSizeClass.EXPANDED -> // expanded width
}
幅(windowWidthSizeClass)に加えて、APIはウィンドウの高さ(windowHeightSizeClass)のクラスも提供します——ランドスケープ方向やデスクトップウィンドウに便利です。
Jetpack Composeでは、Window Size ClassはcurrentWindowAdaptiveInfo()関数を介して使用され、幅と高さのクラスを含むWindowAdaptiveInfoを返します。この関数は、ウィンドウサイズだけでなく、入力タイプ(キーボード、マウス、タッチ)——WindowPostureとWindowLayoutInfoを通じて——も考慮します。
典型的なシナリオは、クラスに応じてレイアウトを切り替えることです。例えば、Compactでは選択肢のあるBottomSheetを表示、Mediumではサイドパネル、Expandedでは恒久的なNavigation Drawerを表示します。
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
when (windowSizeClass) {
WindowWidthSizeClass.COMPACT -> BottomNavigation()
WindowWidthSizeClass.MEDIUM -> NavigationRail()
WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
}
}
Material Design 3では、NavigationSuiteScaffoldコンポーネントが自動的にWindow Size Classに適応します——開発者は条件付きロジックを書く必要がありません。
Material Design 3(Material You)はWindow Size Classと完全に統合されています。Material 3のアダプティブレイアウトシステムは、各クラスでどのナビゲーションコンポーネントを使用するかを決定します:CompactにはBottomNavigation、MediumにはNavigationRail、ExpandedにはNavigationDrawer。
この統合はAdaptive APIレベルで機能し、Window Size Classを他のシグナル——FoldState(フォルダブル端末)とWindowPosture(画面の位置)——と組み合わせます。Adaptive APIはmaterial3-adaptiveライブラリを通じて利用可能です。
Material 3は4つのアダプティブなトップレベルコンポーネントを提供します:ListDetailPaneScaffold、SupportingPaneScaffold、NavigationSuiteScaffold、AdaptiveSheet。それぞれが追加設定なしでWindow Size Classに応じて動作を変更します。
| クラス | ナビゲーションコンポーネント | Pane Scaffold |
|---|---|---|
| Compact | Bottom Navigation | 非表示パネル |
| Medium | Navigation Rail | スライドパネル |
| Expanded | Navigation Drawer | 固定パネル |
Window Size Classを使用すると、モバイル開発において3つの主要な利点が得られます。第一に——予測可能性:何百もの画面サイズの組み合わせの代わりに、開発者は3つのクラスで作業します。これにより、テストシナリオの数とレイアウトに関連するバグが根本的に減少します。
第二に——マルチウィンドウモードへの自動適応。ユーザーがSplit Screenに入ると、ウィンドウ幅が変更され——Window Size Classが即座に再計算され、インターフェースが適応します。このAPIがない場合、分割画面のアプリケーションはスマートフォンインターフェースの縮小版を表示します。
第三に——Material Design 3との一貫性。GoogleはWindow Size Classをアダプティブコンポーネントシステムに組み込んだため、Material 3上に構築されたインターフェースは、追加作業なしで自動的に大画面デザインに関するGoogleの推奨事項に従います。
よくある質問
Screen Size Buckets(small/large/xlarge)は、画面の物理的なサイズに基づくAndroid 1.6〜6.0の時代遅れのアプローチです。Window Size Classはdp単位の利用可能なウィンドウ幅に焦点を当て、ウィンドウサイズが変更されるとリアルタイムで動作します。
Window Size Classは、バックポートライブラリを使用してAndroid 7.0以上のJetpack WindowManagerを通じて利用可能です。Android 6以下では、マルチウィンドウがないためCompactのみです。WindowMetricsを介したフォールバックを使用してください。
端末を展開するとウィンドウ幅が変更され、Window Size Classが自動的に再計算されます。利用可能な領域の増加により、クラスがCompactからExpandedに変わる可能性があります。
はい、ActivityまたはFragmentでWindowManagerを介して可能です。WindowSizeClassを取得した後、条件付きロジックを使用してXMLレイアウトを切り替えたり、Viewの表示状態を変更したりします。
ウィンドウの高さの場合、しきい値は異なります:Compact — 480 dpまで、Medium — 480〜900 dp、Expanded — 900 dp以上。WindowHeightSizeClassはランドスケープ方向やデスクトップで便利です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。