फ़ोन और फ़ोल्ड किए जा सकने वाले डिवाइसों की आउटर स्क्रीन पर ऐप्लिकेशन के ओरिएंटेशन को सीमित करें, लेकिन बड़ी स्क्रीन पर ऐसा न करें

आपका ऐप्लिकेशन, फ़ोन को पोर्ट्रेट मोड में रखने पर बहुत अच्छी तरह से काम करता है. इसलिए, आपने ऐप्लिकेशन को सिर्फ़ पोर्ट्रेट मोड में इस्तेमाल करने की अनुमति दी है. हालांकि, लैंडस्केप मोड में बड़ी स्क्रीन या अनफ़ोल्ड किए गए फ़ोल्डेबल डिवाइसों पर, आपको ज़्यादा काम करने का मौका मिलता है.

फ़ोल्ड किए जा सकने वाले डिवाइस की आउटर स्क्रीन पर ऐप्लिकेशन को सिर्फ़ पोर्ट्रेट मोड में इस्तेमाल करने की अनुमति कैसे दी जा सकती है, जबकि इनर स्क्रीन पर लैंडस्केप मोड को चालू किया जा सकता है?

यह गाइड, कुछ समय के लिए उपलब्ध है. इसका इस्तेमाल तब तक किया जा सकता है, जब तक कि सभी डिवाइस कॉन्फ़िगरेशन के लिए, आपके ऐप्लिकेशन को पूरी तरह से सपोर्ट करने लायक नहीं बना दिया जाता.

नतीजे

डिवाइस को घुमाने पर भी, आपका ऐप्लिकेशन छोटी स्क्रीन पर पोर्ट्रेट ओरिएंटेशन में ही रहता है. बड़ी स्क्रीन पर, ऐप्लिकेशन लैंडस्केप और पोर्ट्रेट ओरिएंटेशन में काम करता है.

वर्शन के साथ काम करने की सुविधा

यह तरीका, सभी एपीआई लेवल के साथ काम करता है.

डिपेंडेंसी

Kotlin

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

शानदार

implementation "androidx.window:window:1.5.1"
implementation "androidx.window:window-core:1.5.1"

ऐप्लिकेशन का ओरिएंटेशन मैनेज करना

बड़ी स्क्रीन पर लैंडस्केप ओरिएंटेशन चालू करने के लिए, अपने ऐप्लिकेशन के मेनिफ़ेस्ट को इस तरह सेट करें कि वह ओरिएंटेशन में होने वाले बदलावों को डिफ़ॉल्ट रूप से मैनेज करे. रनटाइम के दौरान, ऐप्लिकेशन विंडो का साइज़ तय करें. अगर ऐप्लिकेशन की विंडो छोटी है, तो मेनिफ़ेस्ट ओरिएंटेशन सेटिंग को बदलकर, ऐप्लिकेशन के ओरिएंटेशन को सीमित करें.

1. ऐप्लिकेशन मेनिफ़ेस्ट में ओरिएंटेशन सेटिंग तय करना

आपके पास ऐप्लिकेशन के मेनिफ़ेस्ट फ़ाइल के screenOrientation एलिमेंट को शामिल न करने का विकल्प होता है. ऐसा करने पर, ओरिएंटेशन डिफ़ॉल्ट रूप से unspecified पर सेट हो जाता है. इसके अलावा, स्क्रीन ओरिएंटेशन को fullUser पर सेट किया जा सकता है. अगर उपयोगकर्ता ने सेंसर के आधार पर स्क्रीन के रोटेशन को लॉक नहीं किया है, तो आपका ऐप्लिकेशन सभी डिवाइस ओरिएंटेशन के साथ काम करेगा.

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

unspecified और fullUser के बीच का अंतर बहुत कम है, लेकिन ज़रूरी है. screenOrientation वैल्यू तय न करने पर, सिस्टम ओरिएंटेशन चुनता है. साथ ही, ओरिएंटेशन तय करने के लिए सिस्टम जिस नीति का इस्तेमाल करता है वह डिवाइस के हिसाब से अलग-अलग हो सकती है.

दूसरी ओर, fullUser तय करने पर, उपयोगकर्ता के डिवाइस के लिए तय किए गए व्यवहार से ज़्यादा मेल खाता है: अगर उपयोगकर्ता ने सेंसर के आधार पर स्क्रीन रोटेशन को लॉक किया है, तो ऐप्लिकेशन उपयोगकर्ता की प्राथमिकता का पालन करता है; ऐसा न होने पर, सिस्टम स्क्रीन के चार ओरिएंटेशन (पोर्ट्रेट, लैंडस्केप, रिवर्स पोर्ट्रेट या रिवर्स लैंडस्केप) में से किसी एक की अनुमति देता है.

इसके अलावा, सेंसर के डेटा को ध्यान में रखे बिना ओरिएंटेशन का पता लगाने के लिए, nosensor का इस्तेमाल किया जा सकता है. हालांकि, यहां दिया गया कोड भी इसी तरह काम करेगा. screenOrientation देखें.

2. स्क्रीन का साइज़ तय करना

मेनिफ़ेस्ट को उपयोगकर्ता की अनुमति वाले सभी ओरिएंटेशन के साथ काम करने के लिए सेट किया जा सकता है. इससे, स्क्रीन के साइज़ के आधार पर ऐप्लिकेशन के ओरिएंटेशन को प्रोग्राम के हिसाब से तय किया जा सकता है.

मॉड्यूल की build.gradle या build.gradle.kts फ़ाइल में, Jetpack WindowManager लाइब्रेरी जोड़ें:

Kotlin

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

शानदार

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

डिवाइस की स्क्रीन के साइज़ को WindowMetrics ऑब्जेक्ट के तौर पर पाने के लिए, Jetpack WindowManager WindowMetricsCalculator#computeMaximumWindowMetrics() तरीके का इस्तेमाल करें. विंडो मेट्रिक की तुलना, विंडो के साइज़ की क्लास से की जा सकती है. इससे यह तय किया जा सकता है कि ओरिएंटेशन को कब सीमित करना है.

विंडो साइज़ क्लास, छोटी और बड़ी स्क्रीन के बीच ब्रेकपॉइंट उपलब्ध कराती हैं.

स्क्रीन का साइज़ तय करने के लिए, WindowSizeClass#minWidthDp और WindowSizeClass#minHeightDp ब्रेकपॉइंट का इस्तेमाल करें:

/** 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 =
        BREAKPOINTS_V1.computeWindowSizeClass(width / density, height / density)
    return windowSizeClass.minWidthDp == 0
}
    ध्यान दें:
  • उदाहरणों को किसी गतिविधि के तरीकों के तौर पर लागू किया जाता है. इसलिए, गतिविधि को computeMaximumWindowMetrics() के आर्ग्युमेंट में this के तौर पर डीरेफ़रंस किया जाता है.
  • computeCurrentWindowMetrics() के बजाय computeMaximumWindowMetrics() तरीके का इस्तेमाल किया जाता है, क्योंकि ऐप्लिकेशन को मल्टी-विंडो मोड में लॉन्च किया जा सकता है. इससे स्क्रीन ओरिएंटेशन की सेटिंग को अनदेखा किया जाता है. ऐप्लिकेशन विंडो के साइज़ का पता लगाने और ओरिएंटेशन सेटिंग को बदलने का कोई मतलब नहीं है, जब तक कि ऐप्लिकेशन विंडो पूरे डिवाइस की स्क्रीन पर न हो.

अपने ऐप्लिकेशन में computeMaximumWindowMetrics() तरीके को उपलब्ध कराने के लिए, डिपेंडेंसी का एलान करने के निर्देश जानने के लिए, WindowManager देखें.

3. ऐप्लिकेशन मेनिफ़ेस्ट की सेटिंग बदलना

जब आपको पता चल जाए कि डिवाइस की स्क्रीन का साइज़ छोटा है, तब मेनिफ़ेस्ट की screenOrientation सेटिंग को बदलने के लिए, Activity#setRequestedOrientation() को कॉल करें:

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
        }
    })
}

onCreate() और View.onConfigurationChanged() तरीकों में लॉजिक जोड़ने से, आपको विंडो की ज़्यादा से ज़्यादा मेट्रिक मिल सकती हैं. साथ ही, जब गतिविधि का साइज़ बदला जाता है या उसे एक डिसप्ले से दूसरे डिसप्ले पर ले जाया जाता है, तब ओरिएंटेशन सेटिंग को बदला जा सकता है. जैसे, डिवाइस को घुमाने के बाद या फ़ोल्ड किए जा सकने वाले डिवाइस को फ़ोल्ड या अनफ़ोल्ड करने पर. कॉन्फ़िगरेशन में बदलाव कब होते हैं और उनसे ऐक्टिविटी कब फिर से बनती है, इस बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करें लेख पढ़ें.

अगर Jetpack Compose का इस्तेमाल किया जा रहा है, तो इसी तरह का नतीजा पाने के लिए, अपने ऐप्लिकेशन के रूट कंपोज़ेबल में compactScreen() फ़ंक्शन का इस्तेमाल किया जा सकता है.

खास बातें

  • screenOrientation: ऐप्लिकेशन मेनिफ़ेस्ट सेटिंग. इसकी मदद से यह तय किया जा सकता है कि डिवाइस को घुमाने पर आपका ऐप्लिकेशन कैसे काम करेगा
  • Jetpack WindowManager: यह लाइब्रेरी का एक सेट है. इसकी मदद से, ऐप्लिकेशन की विंडो का साइज़ और आसपेक्ट रेशियो तय किया जा सकता है. यह एपीआई लेवल 14 के साथ काम करता है
  • Activity#setRequestedOrientation(): इस तरीके से, रनटाइम के दौरान ऐप्लिकेशन का ओरिएंटेशन बदला जा सकता है

ऐसे कलेक्शन जिनमें यह गाइड शामिल है

यह गाइड, चुनी गई क्विक गाइड के इन कलेक्शन का हिस्सा है. इनमें Android डेवलपमेंट के ज़्यादातर लक्ष्यों के बारे में बताया गया है:

अपने ऐप्लिकेशन को इस तरह से तैयार करें कि वह टैबलेट, फ़ोल्ड किए जा सकने वाले डिवाइसों, और ChromeOS डिवाइसों पर बेहतर तरीके से काम कर सके.

सवाल पूछना या सुझाव/राय देना

अक्सर पूछे जाने वाले सवालों वाले पेज पर जाएं और क्विक गाइड के बारे में जानें. इसके अलावा, हमसे संपर्क करें और हमें अपने सुझाव/राय दें या शिकायत करें.