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

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

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

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

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

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

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

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

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

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

قدم‌ها

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

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

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

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

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

۲. محدود کردن پویا جهت در «نوشتن»

در 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)، می‌توانید هرزمان پیکربندی برنامه تغییر کرد، مثلاً وقتی فعالیت تغییر اندازه می‌دهد، بین نمایشگرها جابه‌جا می‌شود، یا وقتی دستگاه تاشو تا می‌شود یا باز می‌شود، تنظیم گرایش را به‌صورت واکنشی ملغی کنید.

برای اطلاعات بیشتر درباره زمان وقوع تغییرات پیکربندی و زمان ایجاد مجدد فعالیت، به مدیریت تغییرات پیکربندی مراجعه کنید.

نتایج

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

منابع بیشتر

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