डिटैचबल कीबोर्ड मैनेजमेंट

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

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

सभी मामलों में, कीबोर्ड से जुड़ा पूरा डेटा Configuration ऑब्जेक्ट में सेव किया जाता है. कॉन्फ़िगरेशन ऑब्जेक्ट के keyboard और keyboardHidden फ़ील्ड में, कीबोर्ड के टाइप और उसकी उपलब्धता के बारे में जानकारी होती है.

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

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

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

  1. सिस्टम को चालू गतिविधि को फिर से बनाने दें. साथ ही, अपने ऐप्लिकेशन की स्थिति को मैनेज करें.
  2. कॉन्फ़िगरेशन में हुए बदलाव को खुद मैनेज करें (गतिविधि को फिर से नहीं बनाया जाएगा):
    • कीबोर्ड से जुड़ी सभी कॉन्फ़िगरेशन वैल्यू का एलान करें
    • कॉन्फ़िगरेशन में बदलाव करने वाला हैंडलर बनाना

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

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

Jetpack Compose में, कीबोर्ड कॉन्फ़िगरेशन में हुए बदलावों पर दो तरीकों से प्रतिक्रिया दी जा सकती है:

  1. रीऐक्टिव यूज़र इंटरफ़ेस (यूआई): LocalConfiguration.current का इस्तेमाल करके, अपने कंपोज़ेबल में मौजूदा कॉन्फ़िगरेशन की स्थिति को सीधे तौर पर पढ़ें. कीबोर्ड अटैच या डिटैच होने पर, यूज़र इंटरफ़ेस (यूआई) अपने-आप फिर से कंपोज़ हो जाता है, ताकि नई स्थिति के हिसाब से काम कर सके.
  2. साइड-इफ़ेक्ट कॉलबैक: होस्ट ऐक्टिविटी पर कॉन्फ़िगरेशन में बदलाव करने वाले लिसनर को रजिस्टर करने के लिए, लाइफ़साइकल के बारे में जानकारी रखने वाले DisposableEffect का इस्तेमाल करें. इससे आपको ऐक्टिविटी को फिर से बनाए बिना या किसी डमी व्यू एलिमेंट को इंस्टैंटिएट किए बिना, नॉन-यूआई इवेंट (जैसे, लॉगिंग या Analytics) को ट्रिगर करने की सुविधा मिलती है.

सामग्री

  • android:configChanges: यह ऐप्लिकेशन मेनिफ़ेस्ट के <activity> एलिमेंट का एट्रिब्यूट है. यह कुकी, सिस्टम को उन कॉन्फ़िगरेशन बदलावों के बारे में बताती है जिन्हें ऐप्लिकेशन मैनेज करता है.
  • LocalConfiguration: यह कंपोज़ेबल लोकल प्रोवाइडर है. यह मौजूदा डिवाइस Configuration को दिखाता है.
  • DisposableEffect: यह एक साइड-इफ़ेक्ट एपीआई है. यह कंपोज़ेबल के कंपोज़िशन में शामिल होने पर, कोड के ब्लॉक को चलाता है. साथ ही, कंपोज़ेबल के कंपोज़िशन से बाहर निकलने पर, कोड के ब्लॉक को बंद कर देता है.

चरण

configChanges एट्रिब्यूट के बारे में बताएं और कीबोर्ड से जुड़ी वैल्यू जोड़ें, ताकि गतिविधि को फिर से न बनाया जा सके. इसके बाद, अपने कंपोज़ेबल लेआउट को डाइनैमिक तरीके से अडैप्ट करने के लिए, LocalConfiguration.current का इस्तेमाल करें. इसके अलावा, 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
    }

  • दूसरा विकल्प: साइड इफ़ेक्ट लिसनर

    अगर कॉन्फ़िगरेशन में बदलाव होने पर, आपको कोई साइड-इफ़ेक्ट (जैसे कि लॉगिंग, लोकल डेटाबेस अपडेट करना या आंकड़ों को ट्रिगर करना) चलाना है, तो DisposableEffect का इस्तेमाल करके, होस्ट ComponentActivity पर कॉन्फ़िगरेशन में बदलाव होने पर सूचना पाने वाला लिसनर रजिस्टर करें.

    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)
        }
    }

नतीजे

अब आपका ऐप्लिकेशन, चालू गतिविधि को फिर से बनाए बिना, बाहरी कीबोर्ड के अटैच या डिटैच होने पर जवाब देगा.

अन्य संसाधन

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