جهت برنامه در تلفن‌ها محدود شده است اما در صفحه‌نمایش‌های بزرگ محدود نشده است

نماد رده‌بندی دو ستاره

برنامه‌تان در تلفن‌ها در جهت عمودی عالی کار می‌کند، بنابراین برنامه را فقط به جهت عمودی محدود کرده‌اید. اما فرصتی برای انجام کارهای بیشتر در صفحه‌نمایش‌های بزرگ در جهت افقی می‌بینید.

چگونه می‌توانید هر دو را داشته باشید—برنامه را به جهت عمودی در صفحه‌نمایش‌های کوچک محدود کنید، اما جهت افقی را در صفحه‌نمایش‌های بزرگ فعال کنید؟

روال‌های مطلوب

بهترین برنامه‌ها به اولویت‌های کاربر مثل جهت دستگاه احترام می‌گذارند.

رهنمودهای کیفیت برنامه تطبیقی توصیه می‌کنند که برنامه‌ها از همه پیکربندی‌های دستگاه، ازجمله جهت‌های عمودی و افقی، حالت چندپنجره‌ای، و حالت‌های تاشده و بازشده دستگاه‌های تاشو پشتیبانی کنند. برنامه‌ها باید چیدمان‌ها و میاناهای کاربر را برای پیکربندی‌های مختلف بهینه‌سازی کنند و برنامه‌ها باید وضعیت را درطول تغییرات پیکربندی ذخیره و بازیابی کنند.

این دستورالعمل یک اقدام موقت است—کمی پشتیبانی از صفحه‌نمایش بزرگ. تا زمانی که بتوانید برنامه‌تان را برای ارائه پشتیبانی کامل از همه پیکربندی‌های دستگاه بهبود دهید، از این دستورالعمل استفاده کنید.

مواد تشکیل‌دهنده

  • screenOrientation: تنظیم مانیفست برنامه که به شما امکان می‌دهد مشخص کنید برنامه‌تان چگونه به تغییرات جهت دستگاه پاسخ دهد
  • Activity#setRequestedOrientation(): روشی که با آن می‌توانید جهت برنامه را در زمان اجرا تغییر دهید
  • LocalConfiguration: ارائه‌دهنده محلی Composable که Configuration دستگاه فعلی را نشان می‌دهد و به شما امکان می‌دهد ابعاد صفحه‌نمایش را در DP بخوانید.
  • LaunchedEffect: Compose side-effect API که بلوک کد را اجرا می‌کند وقتی کلید تغییر می‌کند (در این مورد، وقتی پیکربندی تغییر می‌کند).

قدم‌ها

برنامه را فعال کنید تا تغییرات جهت را به‌طور پیش‌فرض در مانیفست برنامه مدیریت کند. سپس، در زمان اجرا، از Jetpack Compose برای محدود کردن پویا جهت به حالت عمودی در صفحه‌های فشرده (تلفن‌ها) استفاده کنید، درحالی‌که همه جهت‌ها را در صفحه‌های بزرگ مجاز می‌کنید.

۱. تنظیم جهت را در مانیفست برنامه مشخص کنید

می‌توانید از اعلام عنصر screenOrientation مانیفست برنامه اجتناب کنید (که در این صورت جهت به‌طور پیش‌فرض روی unspecified تنظیم می‌شود) یا جهت صفحه‌نمایش را روی fullUser تنظیم کنید. اگر کاربر چرخش مبتنی بر حسگر را قفل نکرده باشد، برنامه‌تان از همه جهت‌های دستگاه پشتیبانی خواهد کرد.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

تفاوت بین استفاده از unspecified و fullUser جزئی اما مهم است. اگر مقدار screenOrientation را اعلام نکنید، سیستم جهت را انتخاب می‌کند و خط‌مشی‌ای که سیستم برای تعریف جهت استفاده می‌کند ممکن است از دستگاهی به دستگاه دیگر متفاوت باشد. ازسوی‌دیگر، مشخص کردن fullUser با رفتاری که کاربر برای دستگاه تعریف کرده است مطابقت بیشتری دارد: اگر کاربر چرخش مبتنی بر حسگر را قفل کرده باشد، برنامه از اولویت کاربر پیروی می‌کند؛ درغیراین‌صورت، سیستم هریک از چهار جهت ممکن صفحه‌نمایش (عمودی، افقی، عمودی معکوس، یا افقی معکوس) را مجاز می‌کند. android:screenOrientation را ببینید.

۲. محدود کردن پویای جهت در Compose

در Jetpack Compose، می‌توانید ابعاد فعلی صفحه‌نمایش را در DP به‌صورت واکنشی از LocalConfiguration.current بخوانید و از LaunchedEffect برای به‌روزرسانی جهت «فعالیت» هر زمان که پیکربندی تغییر می‌کند استفاده کنید.

اگر عرض یا ارتفاع صفحه‌نمایش کمتر از 600dp باشد (مطابق با نقطه شکست فشرده برای تلفن‌ها)، جهت را به عمودی محدود کنید. درغیراین‌صورت، به سیستم اجازه دهید برنامه را براساس اولویت کاربر (unspecified یا fullUser) بچرخاند.

در اینجا پیاده‌سازی کامل و قابل‌کامپایل آورده شده است:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

با افزودن منطق در بلوک LaunchedEffect(configuration)، می‌توانید هرزمان پیکربندی برنامه تغییر می‌کند، مثلاً وقتی اندازه فعالیت تغییر می‌کند، بین نمایشگرها جابه‌جا می‌شود، یا وقتی دستگاه تاشو تا یا باز می‌شود، تنظیم جهت را به‌طور واکنشی لغو کنید.

برای اطلاعات بیشتر درباره اینکه تغییرات پیکربندی چه زمانی رخ می‌دهد و چه زمانی باعث بازسازی فعالیت می‌شود، به مدیریت تغییرات پیکربندی مراجعه کنید.

نتایج

اکنون برنامه‌تان باید در صفحه‌نمایش‌های کوچک بدون‌توجه به چرخش دستگاه در جهت عمودی باقی بماند. در صفحه‌نمایش‌های بزرگ، برنامه باید از جهت‌های افقی و عمودی پشتیبانی کند.

منابع بیشتر

برای دریافت راهنمایی درباره ارتقا دادن برنامه‌تان برای پشتیبانی از همه پیکربندی‌های دستگاه در همه زمان‌ها، موارد زیر را ببینید: