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

نماد امتیاز دو ستاره

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

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

بهترین شیوه‌ها

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

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

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

مواد لازم

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

مراحل

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

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

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

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

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

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

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

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

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

نتایج

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

منابع اضافی

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