फ़ोन पर ऐप्लिकेशन का ओरिएंटेशन बदलने की सुविधा सीमित है, लेकिन बड़ी स्क्रीन पर ऐसा नहीं है

दो स्टार वाली रेटिंग का आइकॉन

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

आपके पास दोनों विकल्प कैसे हो सकते हैं—ऐप्लिकेशन को छोटी स्क्रीन पर पोर्ट्रेट ओरिएंटेशन में इस्तेमाल करने की अनुमति देना, लेकिन बड़ी स्क्रीन पर लैंडस्केप ओरिएंटेशन में इस्तेमाल करने की अनुमति देना?

सबसे सही तरीके

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

ऐप्लिकेशन की क्वालिटी के लिए अडैप्टिव दिशा-निर्देशों में यह सुझाव दिया गया है कि ऐप्लिकेशन सभी डिवाइस कॉन्फ़िगरेशन के साथ काम करें. जैसे, पोर्ट्रेट और लैंडस्केप ओरिएंटेशन, मल्टी-विंडो मोड, और फ़ोल्ड किए जा सकने वाले डिवाइसों की फ़ोल्ड और अनफ़ोल्ड की गई स्थितियां. ऐप्लिकेशन को अलग-अलग कॉन्फ़िगरेशन के लिए, लेआउट और यूज़र इंटरफ़ेस (यूआई) को ऑप्टिमाइज़ करना चाहिए. साथ ही, कॉन्फ़िगरेशन में बदलाव के दौरान, ऐप्लिकेशन को स्थिति सेव करनी चाहिए और उसे वापस लाना चाहिए.

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

सामग्री

  • screenOrientation: ऐप्लिकेशन मेनिफ़ेस्ट सेटिंग. इसकी मदद से यह तय किया जा सकता है कि डिवाइस को घुमाने पर आपका ऐप्लिकेशन कैसे काम करेगा
  • Activity#setRequestedOrientation(): यह एक ऐसा तरीका है जिसकी मदद से, रनटाइम के दौरान ऐप्लिकेशन के ओरिएंटेशन में बदलाव किया जा सकता है
  • LocalConfiguration: यह कंपोज़ेबल लोकल प्रोवाइडर है, जो मौजूदा डिवाइस Configuration को दिखाता है. इससे आपको डीपी में स्क्रीन डाइमेंशन पढ़ने की अनुमति मिलती है.
  • LaunchedEffect: साइड-इफ़ेक्ट वाला Compose API, जो कुंजी में बदलाव होने पर कोड के ब्लॉक को चलाता है. इस मामले में, कॉन्फ़िगरेशन में बदलाव होने पर कोड के ब्लॉक को चलाया जाता है.

चरण

ऐप्लिकेशन मेनिफ़ेस्ट में, ऐप्लिकेशन को ओरिएंटेशन में होने वाले बदलावों को डिफ़ॉल्ट रूप से मैनेज करने की अनुमति दें. इसके बाद, रनटाइम में Jetpack Compose का इस्तेमाल करके, छोटी स्क्रीन (फ़ोन) पर ओरिएंटेशन को पोर्ट्रेट मोड पर डाइनैमिक तरीके से सेट करें. साथ ही, बड़ी स्क्रीन पर सभी ओरिएंटेशन की अनुमति दें.

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

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

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

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

2. Compose में ओरिएंटेशन को डाइनैमिक तरीके से सीमित करना

Jetpack Compose में, 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) ब्लॉक में लॉजिक जोड़ने से, ऐप्लिकेशन के कॉन्फ़िगरेशन में बदलाव होने पर, ओरिएंटेशन की सेटिंग को तुरंत बदला जा सकता है. जैसे, ऐक्टिविटी का साइज़ बदलने, उसे एक डिसप्ले से दूसरे डिसप्ले पर ले जाने या फ़ोल्ड किए जा सकने वाले डिवाइस को फ़ोल्ड या अनफ़ोल्ड करने पर.

कॉन्फ़िगरेशन में बदलाव कब होते हैं और उनसे ऐक्टिविटी कब फिर से बनती है, इस बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन में हुए बदलावों को मैनेज करें लेख पढ़ें.

नतीजे

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

अन्य संसाधन

अपने ऐप्लिकेशन को सभी डिवाइस कॉन्फ़िगरेशन के साथ हमेशा काम करने के लिए अपग्रेड करने से जुड़ी मदद पाने के लिए, यहां जाएं: