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

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

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

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

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

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

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

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

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

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

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

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

सामग्री

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

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

    अगर कॉन्फ़िगरेशन में बदलाव होने पर आपको कोई साइड-इफ़ेक्ट (जैसे, लॉग इन करना, लोकल डेटाबेस को अपडेट करना या आंकड़ों को ट्रिगर करना) चलाना है, तो होस्ट 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)
        }
    }

नतीजे

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

अन्य संसाधन

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