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

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

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

این راهنما یک اقدام موقتی است تا زمانی که بتوانید برنامه خود را برای ارائه پشتیبانی کامل از تمام تنظیمات دستگاه بهبود بخشید.

جهت گیری برنامه را مدیریت کنید

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

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

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

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

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

2. اندازه صفحه نمایش را تعیین کنید

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

کتابخانه های Jetpack WindowManager را به فایل build.gradle یا build.gradle.kts ماژول اضافه کنید:

کاتلین

implementation("androidx.window:window:version")
implementation("androidx.window:window-core:version")

شیار

implementation 'androidx.window:window:version'
implementation 'androidx.window:window-core:version'

از روش Jetpack WindowManager WindowMetricsCalculator#computeMaximumWindowMetrics() برای به دست آوردن اندازه صفحه نمایش دستگاه به عنوان یک شی WindowMetrics استفاده کنید. معیارهای پنجره را می توان با کلاس های اندازه پنجره مقایسه کرد تا تصمیم بگیرد چه زمانی جهت گیری را محدود کند.

کلاس های اندازه ویندوز نقاط شکست بین صفحه های کوچک و بزرگ را ارائه می دهند.

برای تعیین اندازه صفحه از نقاط شکست WindowWidthSizeClass#COMPACT و WindowHeightSizeClass#COMPACT استفاده کنید:

کاتلین

/** Determines whether the device has a compact screen. **/
fun compactScreen() : Boolean {
    val metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this)
    val width = metrics.bounds.width()
    val height = metrics.bounds.height()
    val density = resources.displayMetrics.density
    val windowSizeClass = WindowSizeClass.compute(width/density, height/density)

    return windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.COMPACT ||
        windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT
}

جاوا

/** Determines whether the device has a compact screen. **/
private boolean compactScreen() {
    WindowMetrics metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this);
    int width = metrics.getBounds().width();
    int height = metrics.getBounds().height();
    float density = getResources().getDisplayMetrics().density;
    WindowSizeClass windowSizeClass = WindowSizeClass.compute(width/density, height/density);
    return windowSizeClass.getWindowWidthSizeClass() == WindowWidthSizeClass.COMPACT ||
                windowSizeClass.getWindowHeightSizeClass() == WindowHeightSizeClass.COMPACT;
}
    توجه:
  • مثال ها به عنوان روش های یک فعالیت پیاده سازی می شوند. و بنابراین، فعالیت به this در آرگومان computeMaximumWindowMetrics() ارجاع داده نمی شود.
  • روش computeMaximumWindowMetrics() به جای computeCurrentWindowMetrics() استفاده می شود زیرا برنامه را می توان در حالت چند پنجره ای راه اندازی کرد که تنظیمات جهت صفحه را نادیده می گیرد. هیچ فایده ای برای تعیین اندازه پنجره برنامه و نادیده گرفتن تنظیمات جهت وجود ندارد، مگر اینکه پنجره برنامه کل صفحه دستگاه باشد.

برای دستورالعمل‌های مربوط به اعلام وابستگی‌ها برای در دسترس قرار دادن متد computeMaximumWindowMetrics() در برنامه خود، به WindowManager مراجعه کنید.

3. تنظیمات مانیفست برنامه را لغو کنید

وقتی تشخیص دادید که دستگاه دارای اندازه صفحه نمایش فشرده است، می توانید Activity#setRequestedOrientation() را فراخوانی کنید تا تنظیمات screenOrientation مانیفست را لغو کنید:

کاتلین

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestedOrientation = if (compactScreen())
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    ...
    // Replace with a known container that you can safely add a
    // view to where the view won't affect the layout and the view
    // won't be replaced.
    val container: ViewGroup = binding.container

    // Add a utility view to the container to hook into
    // View.onConfigurationChanged. This is required for all
    // activities, even those that don't handle configuration
    // changes. You can't use Activity.onConfigurationChanged,
    // since there are situations where that won't be called when
    // the configuration changes. View.onConfigurationChanged is
    // called in those scenarios.
    container.addView(object : View(this) {
        override fun onConfigurationChanged(newConfig: Configuration?) {
            super.onConfigurationChanged(newConfig)
            requestedOrientation = if (compactScreen())
                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
                ActivityInfo.SCREEN_ORIENTATION_FULL_USER
        }
    })
}

جاوا

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstanceState);
    if (compactScreen()) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
    }
    ...
    // Replace with a known container that you can safely add a
    // view to where the view won't affect the layout and the view
    // won't be replaced.
    ViewGroup container = binding.container;

    // Add a utility view to the container to hook into
    // View.onConfigurationChanged. This is required for all
    // activities, even those that don't handle configuration
    // changes. You can't use Activity.onConfigurationChanged,
    // since there are situations where that won't be called when
    // the configuration changes. View.onConfigurationChanged is
    // called in those scenarios.
    container.addView(new View(this) {
        @Override
        protected void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (compactScreen()) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
            }
        }
    });
}

با افزودن منطق به متدهای onCreate() و View.onConfigurationChanged() ، می‌توانید حداکثر معیارهای پنجره را به دست آورید و هر زمان که اندازه فعالیت تغییر می‌کند یا بین نمایشگرها جابه‌جا می‌شود، مانند پس از چرخش دستگاه یا زمانی که یک دستگاه تاشو تا می‌شود یا باز می‌شود، تنظیمات جهت را لغو کنید. برای اطلاعات بیشتر در مورد اینکه چه زمانی تغییرات پیکربندی رخ می دهد و چه زمانی باعث ایجاد تفریح ​​می شود، به تغییرات پیکربندی دسته مراجعه کنید.

نکات کلیدی

  • screenOrientation : تنظیم مانیفست برنامه که به شما امکان می‌دهد مشخص کنید برنامه شما چگونه به تغییرات جهت‌گیری دستگاه پاسخ می‌دهد.
  • Jetpack WindowManager : مجموعه ای از کتابخانه ها که به شما امکان می دهد اندازه و نسبت ابعاد پنجره برنامه را تعیین کنید. سازگار با API سطح 14
  • Activity#setRequestedOrientation() : روشی که با آن می توانید جهت برنامه را در زمان اجرا تغییر دهید

نتایج

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

مجموعه هایی که حاوی این راهنما هستند

این راهنما بخشی از مجموعه‌های راهنمای Quick Guide است که اهداف توسعه Android گسترده‌تری را پوشش می‌دهد:

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

سوال یا بازخورد داشته باشید

به صفحه سوالات متداول ما بروید و درباره راهنماهای سریع بیاموزید یا با ما تماس بگیرید و نظرات خود را با ما در میان بگذارید.