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

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

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

दोनों तरीकों का इस्तेमाल कैसे किया जा सकता है—छोटी स्क्रीन पर ऐप्लिकेशन को पोर्ट्रेट ओरिएंटेशन तक सीमित रखना, लेकिन बड़ी स्क्रीन पर लैंडस्केप ओरिएंटेशन चालू करना?

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

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

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

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

सामग्री

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

चरण

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

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

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

नतीजे

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

अन्य संसाधन

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