अलग किए जा सकने वाले कीबोर्ड की सुविधा से, बड़ी स्क्रीन वाले डिवाइसों पर उपयोगकर्ता की प्रोडक्टिविटी बढ़ाई जा सकती है. जब भी किसी डिवाइस से कीबोर्ड जोड़ा या हटाया जाता है, तो Android कॉन्फ़िगरेशन में बदलाव करता है. इससे यूज़र इंटरफ़ेस (यूआई) की स्थिति का डेटा मिट सकता है. आपका ऐप्लिकेशन, अपनी स्थिति को सेव और रीस्टोर कर सकता है. इससे सिस्टम, गतिविधि को फिर से बनाने की प्रोसेस को मैनेज कर सकता है. इसके अलावा, कीबोर्ड कॉन्फ़िगरेशन में होने वाले बदलावों के लिए, गतिविधि को फिर से बनाने की प्रोसेस को रोका जा सकता है.
हर मामले में, कीबोर्ड से जुड़ा सारा डेटा, Configuration
ऑब्जेक्ट में सेव किया जाता है. कॉन्फ़िगरेशन
ऑब्जेक्ट के keyboard और keyboardHidden फ़ील्ड में, कीबोर्ड के टाइप और उसकी उपलब्धता के बारे में जानकारी होती है.
सबसे सही तरीके
बड़ी स्क्रीन के लिए ऑप्टिमाइज़ किए गए ऐप्लिकेशन, हर तरह के इनपुट डिवाइस के साथ काम करते हैं. इनमें सॉफ़्टवेयर और हार्डवेयर कीबोर्ड के अलावा, स्टाइलस, माउस, ट्रैकपैड, और अन्य पेरिफ़ेरल डिवाइस शामिल हैं.
बाहरी कीबोर्ड के साथ काम करने के लिए, कॉन्फ़िगरेशन में बदलाव करने पड़ते हैं. इन्हें मैनेज करने के दो तरीके हैं:
- सिस्टम को चालू गतिविधि को फिर से बनाने दें. साथ ही, अपने ऐप्लिकेशन की स्थिति को मैनेज करें.
- कॉन्फ़िगरेशन में होने वाले बदलाव को खुद मैनेज करें. इससे गतिविधि फिर से नहीं बनेगी:
- कीबोर्ड से जुड़ी सभी कॉन्फ़िगरेशन वैल्यू का एलान करें
- कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करने वाला हैंडलर बनाएं
प्रोडक्टिविटी ऐप्लिकेशन, टेक्स्ट डालने और अन्य इनपुट के लिए यूज़र इंटरफ़ेस (यूआई) पर बेहतर कंट्रोल की ज़रूरत होती है. ऐसे में, कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करने के लिए, खुद से बदलाव करने का तरीका फ़ायदेमंद साबित हो सकता है.
खास मामलों में, हार्डवेयर कीबोर्ड को जोड़ने या हटाने पर, अपने ऐप्लिकेशन के लेआउट में बदलाव किया जा सकता है. उदाहरण के लिए, टूल या एडिटिंग विंडो के लिए ज़्यादा जगह बनाने के लिए.
Jetpack Compose में, कीबोर्ड कॉन्फ़िगरेशन में होने वाले बदलावों पर दो तरीकों से प्रतिक्रिया दी जा सकती है:
- रिएक्टिव यूज़र इंटरफ़ेस (यूआई):
LocalConfiguration.currentका इस्तेमाल करके, अपने कंपोज़ेबल में सीधे मौजूदा कॉन्फ़िगरेशन की स्थिति पढ़ें. कीबोर्ड को जोड़ने या हटाने पर, यूज़र इंटरफ़ेस (यूआई) नई स्थिति के हिसाब से अपने-आप रीकंपोज़ हो जाता है. - साइड-इफ़ेक्ट कॉलबैक: होस्ट गतिविधि पर, कॉन्फ़िगरेशन में होने वाले बदलावों को सुनने वाले लिसनर को रजिस्टर करने के लिए, लाइफ़साइकल के बारे में जानकारी देने वाले
DisposableEffectका इस्तेमाल करें. इससे, गतिविधि को फिर से बनाए बिना या डमी व्यू एलिमेंट को इंस्टैंशिएट किए बिना, गैर-यूज़र इंटरफ़ेस (यूआई) इवेंट (जैसे, लॉगिंग या Analytics) ट्रिगर किए जा सकते हैं.
सामग्री
android:configChanges: ऐप्लिकेशन मेनिफ़ेस्ट के<activity>एलिमेंट का एट्रिब्यूट. सिस्टम को उन कॉन्फ़िगरेशन में होने वाले बदलावों के बारे में बताता है जिन्हें ऐप्लिकेशन मैनेज करता है.LocalConfiguration: कंपोज़ेबल लोकल प्रोवाइडर, जो मौजूदा डिवाइसConfigurationको दिखाता है.DisposableEffect: Compose साइड-इफ़ेक्ट एपीआई, जो किसी कंपोज़ेबल के कंपोज़िशन में शामिल होने पर, कोड का ब्लॉक चलाता है. साथ ही, कंपोज़ेबल के कंपोज़िशन से बाहर निकलने पर, उसे साफ़ करता है.
चरण
configChanges एट्रिब्यूट का एलान करें और गतिविधि को फिर से बनाने से रोकने के लिए, कीबोर्ड से जुड़ी वैल्यू जोड़ें. इसके बाद, अपने कंपोज़ेबल लेआउट को डाइनैमिक तरीके से अडजस्ट करने के लिए, LocalConfiguration.current का इस्तेमाल करें. इसके अलावा, DisposableEffect का इस्तेमाल करके, कॉन्फ़िगरेशन लिसनर को रजिस्टर करें.
1. configChanges एट्रिब्यूट का एलान करना
ऐप्लिकेशन मेनिफ़ेस्ट में मौजूद <activity> एलिमेंट को अपडेट करें. इसके लिए, पहले से मैनेज किए जा रहे कॉन्फ़िगरेशन
में होने वाले बदलावों की सूची में,
keyboard|keyboardHidden वैल्यू जोड़ें:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. कीबोर्ड कॉन्फ़िगरेशन में होने वाले बदलावों पर प्रतिक्रिया देना
Jetpack Compose में, कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करने के लिए, इनमें से कोई एक विकल्प चुनें. यह इस बात पर निर्भर करता है कि यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा रहा है या साइड-इफ़ेक्ट कॉलबैक को एक्ज़ीक्यूट किया जा रहा है:
पहला विकल्प: रिएक्टिव यूज़र इंटरफ़ेस (यूआई) (सुझाया जाता है)
LocalConfiguration.currentसे सीधे कीबोर्ड का टाइप पढ़ें. हार्डवेयर कीबोर्ड को जोड़ने या हटाने पर, यह वैल्यू बदल जाती है. साथ ही, Compose आपके यूज़र इंटरफ़ेस (यूआई) को अपने-आप रीकंपोज़ कर देता है.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
दूसरा विकल्प: साइड-इफ़ेक्ट लिसनर
अगर कॉन्फ़िगरेशन में होने वाले बदलावों के दौरान, आपको साइड-इफ़ेक्ट (जैसे, लॉगिंग, स्थानीय डेटाबेस को अपडेट करना या Analytics को ट्रिगर करना) चलाना है, तो होस्ट
ComponentActivityपर, कॉन्फ़िगरेशन में होने वाले बदलावों को सुनने वाले लिसनर को रजिस्टर करने के लिए,DisposableEffectका इस्तेमाल करें.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
नतीजे
अब आपका ऐप्लिकेशन, चालू गतिविधि को फिर से बनाए बिना, बाहरी कीबोर्ड को जोड़ने या हटाने पर प्रतिक्रिया देगा.
अन्य संसाधन
कीबोर्ड को जोड़ने या हटाने जैसे कॉन्फ़िगरेशन में होने वाले बदलावों के दौरान, अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) की स्थिति को सेव करने का तरीका जानने के लिए, यूज़र इंटरफ़ेस (यूआई) की स्थितियों को सेव करना लेख पढ़ें.