विंडो मैनेजमेंट

ChromeOS पर, कई विंडो में Android ऐप्लिकेशन काम करते हैं. सिस्टम, ऐप्लिकेशन रेंडर करता है ऐसे विंडो कंटेनर में जिनके आकार का निर्धारण जैसा कि पहली इमेज में दिखाया गया है.

पहला डायग्राम. अलग-अलग डिवाइसों पर मौजूद ऐप्लिकेशन विंडो.

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

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

शुरुआती लॉन्च का साइज़

ऐप्लिकेशन नीचे दिए गए तरीकों से अपने शुरुआती लॉन्च साइज़ का अनुरोध कर सकते हैं:

  • लॉन्च साइज़ का इस्तेमाल सिर्फ़ डेस्कटॉप वाली जगहों पर करें. इससे विंडो मैनेजर को आपको उचित बाउंड देने में मदद मिलती है और स्क्रीन की दिशा. डेस्कटॉप मोड में इस्तेमाल किए जाने पर, इसकी सेटिंग के बारे में बताने के लिए, में दी गई जानकारी अपडेट करनी होगी, <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • स्टैटिक लॉन्च बाउंड का इस्तेमाल करें. अपनी मेनिफ़ेस्ट एंट्री के अंदर <layout> का इस्तेमाल करें गतिविधि के बारे में "समस्या बनी रहती है" तय करने के लिए शुरुआती साइज़, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • डाइनैमिक लॉन्च सीमाओं का इस्तेमाल करें. कोई गतिविधि बना सकती है और उसका इस्तेमाल कर सकती है नई गतिविधि बनाते समय ActivityOptions.setLaunchBounds(Rect). इन्होंने बदलाव किया है एक खाली रेक्टैंगल तय करने से, आपके ऐप्लिकेशन का साइज़ बड़ा किया जा सकता है.

विंडो का साइज़ बदलें

ChromeOS में, उपयोगकर्ता किसी ऐप्लिकेशन की विंडो का साइज़ सामान्य तरीके से बदल सकते हैं. इसके लिए: नीचे दाएं कोने में, जैसा कि दूसरी इमेज में दिखाया गया है.

दूसरा डायग्राम. ऐप्लिकेशन की विंडो का साइज़ बदला जा सकता है.

इस बॉक्स का इस्तेमाल करते समय विंडो का साइज़ बदलने के दो विकल्प हैं View क्लास:

  • कॉल करके डायनैमिक तौर पर कॉन्फ़िगरेशन में होने वाले बदलावों पर कार्रवाई करें onConfigurationChanged(..). उदाहरण के लिए, आप android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है गतिविधि के मेनिफ़ेस्ट में कॉपी हो जाती है. कॉन्फ़िगरेशन के बदलावों को मैनेज करने के बारे में ज़्यादा जानने के लिए, पढ़ें कॉन्फ़िगरेशन के बदलाव मैनेज करना.
  • सिस्टम को गतिविधि फिर से शुरू करने दें. ऐसी स्थिति में, onSaveInstanceState और ViewModel आर्किटेक्चर का इस्तेमाल करें कॉम्पोनेंट का इस्तेमाल करें सेव की गई स्थिति.

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

विंडो के डाइमेंशन

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

मौजूदा कॉन्फ़िगरेशन का पता लगाने के लिए, getResources().getConfiguration() को कॉल करें मौजूदा गतिविधि पर. इस्तेमाल न करें बैकग्राउंड में होने वाली गतिविधि या सिस्टम के संसाधन का कॉन्फ़िगरेशन. बैकग्राउंड में होने वाली गतिविधि का कोई साइज़ नहीं है. इसलिए, हो सकता है कि सिस्टम कॉन्फ़िगरेशन अलग-अलग साइज़ और ओरिएंटेशन वाली कई विंडो होती हैं, इसलिए इसे इस्तेमाल नहीं किया जा सकता इस डेटा को एक्सट्रैक्ट किया जा सकता है.

ध्यान दें कि विंडो का साइज़ और स्क्रीन का साइज़ एक जैसा नहीं होता. पाने के लिए DP में विंडो का साइज़, Activity.getResources().getConfiguration().screenWidth का इस्तेमाल करें और Activity.getResources().getConfiguration().screenHeight. आपने शायद इन्हें स्क्रीन साइज़ का इस्तेमाल करने की ज़रूरत नहीं होती.

कॉन्टेंट की सीमाएं

विंडो का साइज़ बदलने के बाद, उसके कॉन्टेंट की सीमाएं बदल सकती हैं. उदाहरण के लिए, ऐप्लिकेशन में इस्तेमाल होने वाली विंडो तब बदल सकती है, जब ऐसी विंडो बड़ी हो जाती है स्क्रीन पर फ़िट हो जाता है. इन दिशा-निर्देशों का पालन करें:

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

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    ऑब्ज़र्वर का इस्तेमाल करके लगातार मॉनिटरिंग की जा सकती है:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • view.addOnLayoutChangeListener(findViewById(android.R.id.content)) में लिसनर जोड़ें

    अगर ऐप्लिकेशन अपने आर्टवर्क को पहले से स्केल कर रहा है, तो हर बार रिज़ॉल्यूशन बदलने पर ऐसा करें.

फ़्री-फ़ॉर्म का साइज़ बदलना

ChromeOS किसी भी विंडो का साइज़ अपने हिसाब से बदलने की सुविधा देता है. उपयोगकर्ता किसी भी विंडो का साइज़ बदल सकते हैं स्क्रीन पर चौड़ाई, ऊंचाई, और पोज़िशन. कई Android ऐप्लिकेशन बिना लिखे फ़्री-फ़ॉर्म साइज़ बदलने की सुविधा मिलती है. इन समस्याओं पर विचार करें:

  • स्क्रीन की स्थिति बदल सकती है. हमेशा इसका उपयोग करें सिस्टम का इस्तेमाल करता है.
  • अगर Android के व्यू सिस्टम का इस्तेमाल किया जा रहा है, तो आपके पास विंडो का लेआउट इसका आकार बदलने पर अपने आप बदल जाता है.
  • अगर व्यू सिस्टम का इस्तेमाल नहीं किया जाता है और सरफ़ेस का अधिग्रहण नहीं किया जाता है, तो आपके ऐप्लिकेशन को अपने हिसाब से साइज़ में बदलाव करने की सुविधा देती हैं.
  • खास ऐप्लिकेशन के लिए, mLastContent सदस्यों का इस्तेमाल करें या इन कामों के लिए कॉन्टेंट व्यू का इस्तेमाल करें शुरुआती साइज़ तय करते हैं.
  • जब ऐप्लिकेशन चल रहा हो, तो onContentRectChangedNative को सुनें या साइज़ में होने वाले बदलावों पर प्रतिक्रिया देने के लिए, onGlobalLayout इवेंट.
  • ऐप्लिकेशन का साइज़ बदलने पर, लेआउट और आर्टवर्क को रीस्केल या फिर से लोड करें और इनपुट एरिया अपडेट करें.

फ़ुल स्‍क्रीन मोड

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

स्क्रीन ओरिएंटेशन

किसी Android ऐप्लिकेशन का सबसे सामान्य ओरिएंटेशन पोर्ट्रेट होता है, क्योंकि ज़्यादातर फ़ोन को रोका नहीं जा सकता. पोर्ट्रेट भले ही फ़ोन के लिए अच्छा है, लेकिन यह लैपटॉप और टैबलेट, जहां लैंडस्केप को प्राथमिकता दी जाती है. पाने के लिए अपने ऐप्लिकेशन के लिए सबसे अच्छे नतीजे पाएं.

कुछ Android ऐप्लिकेशन को लगता है कि जब किसी डिवाइस को पोर्ट्रेट मोड में रखा जाएगा, तो रोटेशन मान यह है Surface.ROTATION_0. यह बात ज़्यादातर Android डिवाइसों पर लागू होती है. हालांकि, जब ऐप्लिकेशन किसी तय ARC मोड, पोर्ट्रेट ओरिएंटेशन के लिए रोटेशन वैल्यू यह नहीं होगी Surface.ROTATION_0.

एक्सलरोमीटर या इससे मिलते-जुलते ऑब्जेक्ट को पढ़ते समय, सटीक रोटेशन वैल्यू पाने के लिए Display.getRotation() का इस्तेमाल करें और ऐक्सिस को स्वैप कर लें.

रूट ऐक्टिविटी और ओरिएंटेशन

Chromebook की विंडो में, ऐक्टिविटी विंडो का स्टैक मौजूद है. हर विंडो का आकार और ओरिएंटेशन समान है.

स्क्रीन की दिशा और साइज़ में अचानक होने वाले बदलाव, डेस्कटॉप पर भ्रम की स्थिति पैदा करते हैं पर्यावरण को ध्यान में रखते हुए काम करना. Chromebook विंडो मैनेजर इसे इसी तरीके से बचाता है से Android के साइड-बाय-साइड मोड में: स्टैक कंट्रोल के सबसे नीचे मौजूद गतिविधि बताई गई सभी गतिविधियों की विशेषताएं होनी चाहिए. इसकी वजह से अनचाही स्थितियां पैदा हो सकती हैं जहां हाल ही में शुरू की गई कोई गतिविधि, पोर्ट्रेट मोड में हो जाती है और उसका साइज़ नहीं बदला जा सकता और साइज़ बदलने की सुविधा भी मिलती है.

डिवाइस मोड का यहां असर होता है: टैबलेट मोड में, स्क्रीन की दिशा नहीं लॉक होती है और हर विंडो का अपना ओरिएंटेशन उसी तरह बनाए रखें जैसा Android पर आम तौर पर होता है.

ओरिएंटेशन के लिए दिशा-निर्देश

ओरिएंटेशन हैंडल करने के लिए इन दिशा-निर्देशों का पालन करें:

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

दूसरी ज़रूरी बातें

Android ऐप्लिकेशन का इस्तेमाल करते समय इन बातों का ध्यान रखें: ChromeOS:

  • अपनी गतिविधि के onDestroy तरीके में finish() को कॉल न करें. इससे ऐप्लिकेशन का साइज़ बदलने पर, वह बंद हो जाएगा और रीस्टार्ट नहीं होगा.
  • ऐसे विंडो टाइप का इस्तेमाल न करें जो काम नहीं करते. जैसे, TYPE_KEYGUARD और TYPE_APPLICATION_MEDIA.
  • उन ऑब्जेक्ट को कैश मेमोरी में सेव करके जिन्हें तेज़ी से रीस्टार्ट किया जा सकता है पहले से ही तय किया गया है.
  • अगर आप नहीं चाहते कि उपयोगकर्ता आपके ऐप्लिकेशन का साइज़ बदलें, तो android:resizeableActivity=false को अपलोड करने की ज़रूरत नहीं है.
  • अपने ऐप्लिकेशन की जांच करके यह पक्का करें कि यह विंडो का साइज़ सही रखें.