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

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

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

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

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

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

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

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

सामग्री

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

चरण

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

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

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

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

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

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

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

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

नतीजे

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

अन्य संसाधन

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