Window Size Class — این چیست، کلاس‌های اندازه و توسعه

نویسنده: IT Sectr منتشر شده: 2026-06-08 زمان مطالعه: 9 دقیقه

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 برای دسته‌بندی عرض پنجره به Compact، Medium و Expanded.
  • Compact — کلاس برای پنجره‌های باریک تا 600 dp، معمولی برای تلفن‌ها در حالت عمودی.
  • Medium — کلاس برای پنجره‌های 600–840 dp، مشخصه تبلت‌ها در حالت عمودی و تلفن‌ها در حالت افقی.
  • Expanded — کلاس برای پنجره‌های عریض از 840 dp، موجود در تبلت‌ها و دسکتاپ.
  • Material Design 3 از Window Size Class به عنوان پایه‌ای برای adaptive layout استفاده می‌کند.

Window Size Class چیست؟

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 کلاس یکسانی دریافت می‌کنند — رابط به طور قابل پیش‌بینی یکسان خواهد بود.

سه کلاس اندازه پنجره Android

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 چگونه کار می‌کند

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.

kotlin
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()

when (windowSizeClass.windowWidthSizeClass) {
    WindowWidthSizeClass.COMPACT -> // عرض فشرده
    WindowWidthSizeClass.MEDIUM  -> // عرض متوسط
    WindowWidthSizeClass.EXPANDED -> // عرض گسترده
}

علاوه بر عرض (windowWidthSizeClass)، API کلاسی برای ارتفاع پنجره (windowHeightSizeClass) ارائه می‌دهد — مفید برای حالت افقی و پنجره‌های دسکتاپ.

Window Size Class در Jetpack Compose

در Jetpack Compose Window Size Class از طریق تابع currentWindowAdaptiveInfo() استفاده می‌شود که WindowAdaptiveInfo را با کلاس‌های عرض و ارتفاع برمی‌گرداند. این تابع نه تنها اندازه پنجره، بلکه نوع ورودی (صفحه کلید، ماوس، لمسی) را — از طریق WindowPosture و WindowLayoutInfo — در نظر می‌گیرد.

سناریوی معمول — تغییر بین چیدمان‌ها بر اساس کلاس. مثلاً در Compact BottomSheet با انتخاب نمایش داده می‌شود، در Medium — پنل کناری، در Expanded — Navigation Drawer دائمی.

kotlin
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
    when (windowSizeClass) {
        WindowWidthSizeClass.COMPACT -> BottomNavigation()
        WindowWidthSizeClass.MEDIUM  -> NavigationRail()
        WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
    }
}

در Material Design 3 مؤلفه‌های NavigationSuiteScaffold به طور خودکار با Window Size Class تطبیق می‌یابند — توسعه‌دهنده نیازی به نوشتن منطق شرطی ندارد.

Window Size Class و Material Design 3

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 ComponentPane Scaffold
CompactBottom Navigationپنل مخفی
MediumNavigation Railپنل کشویی
ExpandedNavigation Drawerپنل دائمی

مزایای چیدمان‌های تطبیقی

استفاده از Window Size Class سه مزیت کلیدی در توسعه موبایل دارد. اول — قابلیت پیش‌بینی: به جای صدها ترکیب از اندازه‌های صفحه، توسعه‌دهنده با سه کلاس کار می‌کند. این تعداد سناریوهای تست و اشکالات مربوط به چیدمان را به شدت کاهش می‌دهد.

دوم — تطبیق خودکار با حالت چند پنجره‌ای. هنگامی که کاربر وارد Split Screen می‌شود، عرض پنجره تغییر می‌کند — Window Size Class فوراً دوباره محاسبه می‌شود و رابط تطبیق می‌یابد. بدون این API، برنامه در صفحه تقسیم شده نسخه کاهش یافته رابط تلفن را نشان می‌دهد.

سوم — سازگاری با Material Design 3. Google Window Size Class را در سیستم مؤلفه‌های تطبیقی تعبیه کرده است، بنابراین رابط‌های ساخته شده بر روی Material 3 به طور خودکار از توصیه‌های Google برای طراحی صفحه بزرگ بدون کار اضافی پیروی می‌کنند.

سؤالات متداول

Window Size Class چه تفاوتی با Screen Size Buckets دارد؟

Screen Size Buckets (small/large/xlarge) — رویکرد قدیمی Android 1.6–6.0 بر اساس اندازه فیزیکی صفحه. Window Size Class بر عرض موجود پنجره بر حسب dp تمرکز دارد و در زمان واقعی با تغییر اندازه پنجره کار می‌کند.

آیا باید Window Size Class را در Android 6 و پایین‌تر پشتیبانی کرد؟

Window Size Class از طریق Jetpack WindowManager در Android 7.0+ با کتابخانه backport در دسترس است. برای Android 6 و پایین‌تر — فقط Compact، زیرا multi-window وجود ندارد. از fallback از طریق WindowMetrics استفاده کنید.

Window Size Class در دستگاه‌های تاشو چگونه کار می‌کند؟

هنگام باز کردن دستگاه، عرض پنجره تغییر می‌کند و Window Size Class به طور خودکار دوباره محاسبه می‌شود. کلاس می‌تواند از Compact به Expanded به دلیل افزایش منطقه موجود تغییر کند.

آیا می‌توان از Window Size Class در XML (Views) استفاده کرد؟

بله، از طریق WindowManager در Activity یا Fragment. پس از دریافت WindowSizeClass از منطق شرطی برای تغییر بین چیدمان‌های XML یا تغییر قابلیت مشاهده View استفاده کنید.

چه آستانه‌هایی برای WindowHeightSizeClass استفاده می‌شود؟

برای ارتفاع پنجره آستانه‌ها متفاوت است: Compact — تا 480 dp، Medium — 480–900 dp، Expanded — از 900 dp. WindowHeightSizeClass در حالت افقی و دسکتاپ مفید است.

خلاصه

  • Window Size Class — API Jetpack WindowManager برای دسته‌بندی عرض پنجره به Compact، Medium و Expanded.
  • Compact — تا 600 dp، رابط تک ستونی، Bottom Navigation.
  • Medium — 600–840 dp، رابط دو ستونی، Navigation Rail.
  • Expanded — از 840 dp، رابط چند پنلی، Navigation Drawer.
  • Jetpack Compose — تابع currentWindowAdaptiveInfo() برای دریافت کلاس در زمان اجرا.
  • Material Design 3 — مؤلفه‌های تطبیقی به طور خودکار به Window Size Class واکنش نشان می‌دهند.
  • نتیجه‌گیری — Window Size Class جایگزین تطبیق سنتی بر breakpoints می‌شود و رابط‌ها را در همه دستگاه‌ها قابل پیش‌بینی می‌کند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید