Window Size Class یک API از Jetpack WindowManager است که پنجره برنامه را به سه دسته تقسیم میکند: Compact، Medium و Expanded. به جای بررسی وضوح فیزیکی یا تراکم پیکسل، کلاسها عرض موجود را بر حسب dp تحلیل میکنند — این نتیجه قابل پیشبینی را در هر دستگاهی میدهد. بر اساس Android Developers Documentation (2025)، Window Size Class به استانداردی برای رابطهای تطبیقی در Jetpack Compose و سیستم View به لطف WindowManager تبدیل شده است.
نکات اصلی
Window Size Class یک API از پلتفرم Android است که بخشی از کتابخانه Jetpack WindowManager میباشد و فضای موجود پنجره برنامه را به سه دسته طبقهبندی میکند. بر خلاف رویکرد سنتی با کمیتسازهای منابع (small/large/xlarge)، Window Size Class مجموعهای از مقادیر گسسته را ارائه میدهد که توسعهدهنده میتواند در طراحی رابط بر آنها تکیه کند.
این API در Android 7.0 Nougat به عنوان بخشی از پشتیبانی از حالت چند پنجرهای ظاهر شد، اما پیادهسازی فعال با Jetpack WindowManager 1.1 (2022) آغاز شد. Google Window Size Class را به عنوان ابزار اصلی برای ساخت چیدمانهای تطبیقی به جای بررسی عرض صفحه از طریق Display.getSize() توصیه میکند.
طبقهبندی بر اساس عرض پنجره بر حسب dp است، نه اندازه فیزیکی یا تراکم پیکسل. این بدان معناست که دو دستگاه با وضوح متفاوت اما عرض یکسان بر حسب dp کلاس یکسانی دریافت میکنند — رابط به طور قابل پیشبینی یکسان خواهد بود.
Compact — کلاس برای پنجرههای با عرض تا 600 dp. تلفن در حالت عمودی، اکثر تلفنهای تاشو (Galaxy Z Flip) در حالت بسته. رابط در یک ستون ساخته میشود، ناوبری از طریق Bottom Navigation.
Medium — کلاس برای پنجرههای با عرض 600–840 dp. تبلت در حالت عمودی، تلفن در حالت افقی، دستگاه تاشو در حالت نیمهباز. رابط از دو ستون استفاده میکند — مثلاً لیست در چپ و جزئیات در راست. Navigation Rail جایگزین Bottom Navigation میشود.
Expanded — کلاس برای پنجرههای با عرض از 840 dp. تبلت در حالت افقی، پنجره دسکتاپ، دستگاه تاشو در حالت باز. رابط میتواند از سه یا بیشتر پنل، Permanent Navigation Drawer، پنلهای ابزار استفاده کند.
در Material Design 3 برای هر کلاس مؤلفههای تطبیقی تعریف شدهاند: Navigation Rail برای Medium، Navigation Drawer برای Expanded، Bottom Navigation برای Compact. توسعهدهنده نیازی به انتخاب breakpoints ندارد — آنها قبلاً توسط API تعیین شدهاند.
Window Size Class بر اساس عرض فعلی پنجره برنامه بر حسب dp با در نظر گرفتن عناصر سیستمی — نوار وضعیت، پنل ناوبری، تقسیم صفحه در Split Screen محاسبه میشود. API در هنگام تغییر پیکربندی پنجره فعال میشود: چرخش دستگاه، ورود به حالت چند پنجرهای، باز کردن دستگاه تاشو.
برای دریافت کلاس از کلاس WindowSizeClass از کتابخانه androidx.window استفاده میشود. توسعهدهنده بر روی Flow (Kotlin) یا LiveData (Java) مشترک میشود که به طور خودکار کلاس را در هر تغییر اندازه پنجره بهروز میکند — بدون پردازش دستی onConfigurationChanged.
طبقهبندی در سه مرحله انجام میشود. اول — اندازهگیری عرض فعلی پنجره بر حسب پیکسل. دوم — تبدیل به dp از طریق DisplayMetrics.density. سوم — مقایسه مقدار به دست آمده با آستانهها: کمتر از 600 dp — Compact، 600–840 — Medium، از 840 — Expanded.
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()
when (windowSizeClass.windowWidthSizeClass) {
WindowWidthSizeClass.COMPACT -> // عرض فشرده
WindowWidthSizeClass.MEDIUM -> // عرض متوسط
WindowWidthSizeClass.EXPANDED -> // عرض گسترده
}
علاوه بر عرض (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 یکپارچه شده است. سیستم adaptive layout در Material 3 تعیین میکند که از کدام مؤلفه ناوبری در هر کلاس استفاده شود: BottomNavigation برای Compact، NavigationRail برای Medium، NavigationDrawer برای Expanded.
این یکپارچهسازی در سطح Adaptive API کار میکند که Window Size Class را با سایر سیگنالها — FoldState (دستگاه تاشو) و WindowPosture (موقعیت صفحه) ترکیب میکند. Adaptive API از طریق کتابخانه material3-adaptive در دسترس است.
Material 3 چهار مؤلفه تطبیقی سطح بالا ارائه میدهد: ListDetailPaneScaffold، SupportingPaneScaffold، NavigationSuiteScaffold و AdaptiveSheet. هر یک از آنها رفتار خود را بر اساس Window Size Class بدون پیکربندی اضافی تغییر میدهد.
| کلاس | Navigation Component | Pane Scaffold |
|---|---|---|
| Compact | Bottom Navigation | پنل مخفی |
| Medium | Navigation Rail | پنل کشویی |
| Expanded | Navigation Drawer | پنل دائمی |
استفاده از Window Size Class سه مزیت کلیدی در توسعه موبایل دارد. اول — قابلیت پیشبینی: به جای صدها ترکیب از اندازههای صفحه، توسعهدهنده با سه کلاس کار میکند. این تعداد سناریوهای تست و اشکالات مربوط به چیدمان را به شدت کاهش میدهد.
دوم — تطبیق خودکار با حالت چند پنجرهای. هنگامی که کاربر وارد 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 از طریق Jetpack WindowManager در Android 7.0+ با کتابخانه backport در دسترس است. برای Android 6 و پایینتر — فقط Compact، زیرا multi-window وجود ندارد. از fallback از طریق WindowMetrics استفاده کنید.
هنگام باز کردن دستگاه، عرض پنجره تغییر میکند و Window Size Class به طور خودکار دوباره محاسبه میشود. کلاس میتواند از Compact به Expanded به دلیل افزایش منطقه موجود تغییر کند.
بله، از طریق WindowManager در Activity یا Fragment. پس از دریافت WindowSizeClass از منطق شرطی برای تغییر بین چیدمانهای XML یا تغییر قابلیت مشاهده View استفاده کنید.
برای ارتفاع پنجره آستانهها متفاوت است: Compact — تا 480 dp، Medium — 480–900 dp، Expanded — از 900 dp. WindowHeightSizeClass در حالت افقی و دسکتاپ مفید است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید