पिछले पेज पर वापस जाने के जेस्चर का इस्तेमाल करने की सुविधा जोड़ें

पहली इमेज. फ़ोन पर, अनुमान लगाकर पीछे जाने के जेस्चर के लुक और फ़ील का मॉकअप

'पीछे जाने पर झलक दिखाने वाला हाथ का जेस्चर', जेस्चर नेविगेशन की एक सुविधा है. इसकी मदद से लोग यह देख सकते हैं कि पीछे की ओर स्वाइप करने पर उन्हें कहां ले जाया जाएगा.

उदाहरण के लिए, पीछे की ओर स्वाइप करने वाले जेस्चर का इस्तेमाल करने पर, आपके ऐप्लिकेशन के पीछे मौजूद होम स्क्रीन की ऐनिमेशन वाली झलक दिख सकती है. यह झलक, पहली इमेज में दिए गए मॉकअप में दिखाई गई है.

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

इस पेज के अगले सेक्शन में बताए गए तरीके से, वापस होम पेज पर जाने वाले इस ऐनिमेशन की जांच की जा सकती है.

पीछे जाने के लिए किए जाने वाले जेस्चर की सुविधा को चालू करने के लिए, आपको अपने ऐप्लिकेशन को अपडेट करना होगा. इसके लिए, OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) या इसके बाद के वर्शन वाले एपीआई का इस्तेमाल करें. इसके अलावा, नए OnBackInvokedCallback प्लैटफ़ॉर्म एपीआई का इस्तेमाल करें. ये एपीआई, पुराने वर्शन के साथ काम करते हैं. ज़्यादातर ऐप्लिकेशन, पुराने सिस्टम के साथ काम करने वाले AndroidX API का इस्तेमाल करते हैं.

इस अपडेट में, बैक नेविगेशन को सही तरीके से इंटरसेप्ट करने के लिए माइग्रेशन का तरीका बताया गया है. इसमें KeyEvent.KEYCODE_BACK और onBackPressed तरीकों वाली किसी भी क्लास, जैसे कि Activity और Dialog से बैक इंटरसेप्शन को नए सिस्टम के बैक एपीआई से बदलना शामिल है.

कोडलैब और Google I/O वीडियो

इस पेज पर दिए गए दस्तावेज़ का इस्तेमाल करने के साथ-साथ, हमारे कोडलैब को आज़माएं. इसमें AndroidX Activity API का इस्तेमाल करके, पीछे जाने पर झलक दिखाने वाले जेस्चर को हैंडल करने वाले WebView को लागू करने का एक सामान्य उदाहरण दिया गया है.

AndroidX और प्लैटफ़ॉर्म एपीआई लागू करने के अन्य उदाहरणों के लिए, हमारा Google I/O वीडियो भी देखा जा सकता है.

Compose में कस्टम बैक जेस्चर हैंडल करना

Compose, पिछले पेज पर वापस जाने के लिए हाथ से किए गए जेस्चर को मैनेज करने के लिए, PredictiveBackHandler कंपोज़ेबल उपलब्ध कराता है. इस एपीआई की मदद से, बैक जेस्चर का जवाब दिया जा सकता है. साथ ही, यह BackEventCompat ऑब्जेक्ट का Flow उपलब्ध कराता है. इसका इस्तेमाल, उपयोगकर्ता के स्वाइप करने पर कस्टम ऐनिमेशन या ट्रांज़िशन लागू करने के लिए किया जा सकता है.

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress
        }
        // Handle the final back action (e.g., navigate back)
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI
    }
}

अगर आपको प्रोग्रेस को ट्रैक किए बिना सिर्फ़ वापस जाने के जेस्चर को रोकना है, तो BackHandler का इस्तेमाल करें.

डिफ़ॉल्ट बैक नेविगेशन का इस्तेमाल करने वाले ऐप्लिकेशन को अपडेट करना

अनुमानित बैक सुविधा डिफ़ॉल्ट रूप से चालू होती है.

अगर आपका ऐप्लिकेशन, फ़्रैगमेंट या नेविगेशन कॉम्पोनेंट का इस्तेमाल करता है, तो उसे AndroidX Activity 1.6.0-alpha05 या इसके बाद के वर्शन पर भी अपग्रेड करें.

कस्टम बैक नेविगेशन का इस्तेमाल करने वाले ऐप्लिकेशन को अपडेट करना

अगर आपके ऐप्लिकेशन में कस्टम बैक बिहेवियर लागू किया गया है, तो माइग्रेट करने के अलग-अलग तरीके हैं. ये तरीके इस बात पर निर्भर करते हैं कि ऐप्लिकेशन में AndroidX का इस्तेमाल किया गया है या नहीं. साथ ही, यह भी देखा जाता है कि ऐप्लिकेशन में बैक नेविगेशन को कैसे हैंडल किया जाता है.

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

AndroidX बैक नेविगेशन को लागू करने की सुविधा माइग्रेट करना

इस तरह के इस्तेमाल के मामले सबसे ज़्यादा होते हैं. साथ ही, हम भी इसी तरह के इस्तेमाल का सुझाव देते हैं. यह उन नए या मौजूदा ऐप्लिकेशन पर लागू होता है जो OnBackPressedDispatcher का इस्तेमाल करके, कस्टम जेस्चर नेविगेशन हैंडलिंग लागू करते हैं. इसके बारे में कस्टम बैक नेविगेशन उपलब्ध कराना लेख में बताया गया है.

यह पक्का करने के लिए कि OnBackPressedDispatcher का इस्तेमाल करने वाले एपीआई (जैसे कि फ़्रैगमेंट और नेविगेशन कॉम्पोनेंट), पीछे जाने पर झलक दिखाने वाले जेस्चर के साथ आसानी से काम करें, AndroidX Activity 1.6.0-alpha05 पर अपग्रेड करें.

```xml
// In your build.gradle file:
dependencies {

// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```

AndroidX के ऐसे ऐप्लिकेशन को AndroidX API पर माइग्रेट करें जिनमें बैक नेविगेशन के ऐसे एपीआई शामिल हैं जो काम नहीं करते

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

काम न करने वाले एपीआई को AndroidX API पर माइग्रेट करने के लिए:

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

  2. वापस जाने के लिए किए जाने वाले जेस्चर को इंटरसेप्ट करना बंद करने के लिए, OnBackPressedCallback को बंद करें.

  3. OnBackPressed या KeyEvent.KEYCODE_BACK की मदद से, बैक इवेंट को इंटरसेप्ट करना बंद करें.

  4. पक्का करें कि आपने AndroidX Activity 1.6.0-alpha05 पर अपग्रेड किया हो.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    

पीछे जाने पर झलक दिखाने वाले हाथ के जेस्चर की सुविधा से ऑप्ट आउट करना

ऑप्ट आउट करने के लिए, AndroidManifest.xml में <application> टैग में जाकर, android:enableOnBackInvokedCallback फ़्लैग को false पर सेट करें.

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

इस सेटिंग को 'गलत है' पर सेट करने से ये काम होते हैं:

  • इस सेटिंग से, प्रिडिक्टिव बैक जेस्चर के सिस्टम ऐनिमेशन बंद हो जाते हैं.
  • OnBackInvokedCallback को अनदेखा करता है, लेकिन OnBackPressedCallback कॉल अब भी काम करते हैं.

गतिविधि के लेवल पर ऑप्ट आउट करना

android:enableOnBackInvokedCallback फ़्लैग की मदद से, गतिविधि के लेवल पर प्रेडिक्टिव सिस्टम ऐनिमेशन से ऑप्ट आउट किया जा सकता है. इस सुविधा की मदद से, एक साथ कई गतिविधियां करने वाले बड़े ऐप्लिकेशन को प्रेडिक्टिव बैक जेस्चर पर माइग्रेट करना आसान हो जाता है.

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

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

android:enableOnBackInvokedCallback फ़्लैग का इस्तेमाल करते समय, इन बातों का ध्यान रखें:

  • android:enableOnBackInvokedCallback=false सेटिंग, ऐक्टिविटी लेवल या ऐप्लिकेशन लेवल पर, अनुमानित बैक ऐनिमेशन को बंद कर देती है. यह इस बात पर निर्भर करता है कि आपने टैग कहां सेट किया है. साथ ही, यह सिस्टम को OnBackInvokedCallback प्लैटफ़ॉर्म एपीआई के कॉल को अनदेखा करने का निर्देश देती है. हालांकि, OnBackPressedCallback को कॉल करने की सुविधा अब भी काम करती है, क्योंकि OnBackPressedCallback पुराने सिस्टम के साथ काम करता है. साथ ही, यह onBackPressed एपीआई को कॉल करता है. यह एपीआई, Android 13 से पहले के वर्शन पर काम नहीं करता.
  • ऐप्लिकेशन लेवल पर enableOnBackInvokedCallback फ़्लैग सेट करने से, ऐप्लिकेशन में मौजूद सभी गतिविधियों के लिए डिफ़ॉल्ट वैल्यू सेट हो जाती है. गतिविधि लेवल पर फ़्लैग सेट करके, हर गतिविधि के लिए डिफ़ॉल्ट वैल्यू को बदला जा सकता है. ऐसा करने का तरीका, ऊपर दिए गए कोड के उदाहरण में दिखाया गया है.

कॉल बैक के सबसे सही तरीके

यहां, सिस्टम बैक कॉल बैक का इस्तेमाल करने के सबसे सही तरीके दिए गए हैं; PredictiveBackHandler या BackHandler (Compose के लिए), OnBackPressedCallback या OnBackInvokedCallback.

उस यूज़र इंटरफ़ेस (यूआई) की स्थिति का पता लगाएं जो हर कॉलबैक को चालू और बंद करती है

यूज़र इंटरफ़ेस (यूआई) की स्थिति एक ऐसी प्रॉपर्टी है जो यूज़र इंटरफ़ेस (यूआई) के बारे में बताती है. हमारा सुझाव है कि आप यहां दिए गए सामान्य चरणों को फ़ॉलो करें.

  1. यूआई की ऐसी स्थिति का पता लगाएं जिसमें हर कॉलबैक को चालू और बंद किया जा सकता है.

  2. observable data holder type का इस्तेमाल करके, उस स्थिति को तय करें. जैसे, StateFlow या Compose State. इसके बाद, स्थिति में बदलाव होने पर कॉलबैक को चालू या बंद करें.

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

यूज़र इंटरफ़ेस (यूआई) लॉजिक के लिए, सिस्टम के बैक कॉलबैक का इस्तेमाल करना

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

अगर आपका ऐप्लिकेशन PRIORITY_DEFAULT या PRIORITY_OVERLAY के साथ OnBackPressedCallback या OnBackInvokedCallback चालू करता है, तो अनुमानित बैक ऐनिमेशन काम नहीं करते. ऐसे में, आपको बैक इवेंट को मैनेज करना होगा. कारोबारी नियम लागू करने या लॉग करने के लिए, इन कॉलबैक को न बनाएं.

अगर आपके ऐप्लिकेशन को उपयोगकर्ता के वापस स्वाइप करने पर, कारोबार से जुड़ी लॉजिक या लॉगिंग की प्रोसेस को पूरा करना है, तो इन तरीकों का इस्तेमाल करें:

  • Android 16 और इसके बाद के वर्शन वाले डिवाइसों पर, PRIORITY_SYSTEM_NAVIGATION_OBSERVER के साथ OnBackInvokedCallback का इस्तेमाल करें. इससे एक ऐसा ऑब्ज़र्वर-कॉलबैक बनता है जो बैक इवेंट का इस्तेमाल नहीं करता. उदाहरण के लिए, इस कॉलबैक को तब रजिस्टर किया जा सकता है, जब उपयोगकर्ता रूट ऐक्टिविटी से वापस स्वाइप करता है. दूसरे शब्दों में कहें, तो जब उपयोगकर्ता आपका ऐप्लिकेशन छोड़ देता है. इस मामले में, बैक इवेंट को लॉग किया जा सकता है या कारोबार से जुड़ा अन्य लॉजिक चलाया जा सकता है. साथ ही, होम पेज पर वापस जाने वाला ऐनिमेशन अब भी चलेगा.
  • गतिविधि से गतिविधि या फ़्रैगमेंट से गतिविधि के मामलों के लिए, लॉग करें कि क्या onDestroy में मौजूद isFinishing, गतिविधि के लाइफ़साइकल में true है.
  • फ़्रैगमेंट-टू-फ़्रैगमेंट मामलों के लिए, लॉग करें कि अगर isRemoving, फ़्रैगमेंट के व्यू लाइफ़साइकल में onDestroy के अंदर है, तो यह सही है. इसके अलावा, FragmentManager.OnBackStackChangedListener में onBackStackChangeStarted या onBackStackChangeCommitted तरीकों का इस्तेमाल करके लॉग इन करें.
  • Compose के मामले में, Compose डेस्टिनेशन से जुड़े ViewModel के onCleared() कॉलबैक में लॉग करें. यह सबसे अच्छा सिग्नल है. इससे यह पता चलता है कि कंपोज़ डेस्टिनेशन को बैक स्टैक से कब हटाया गया और उसे कब डिस्ट्रॉय किया गया.

सिंगल रिस्पॉन्सबिलिटी वाले कॉलबैक बनाना

डिस्पैचर में एक से ज़्यादा कॉलबैक जोड़े जा सकते हैं. कॉलबैक को एक स्टैक में जोड़ा जाता है. इसमें, सबसे आखिर में जोड़ा गया चालू किया गया कॉलबैक, बैक जेस्चर को हैंडल करता है. हर बैक जेस्चर के लिए एक कॉलबैक होता है.

अगर कॉलबैक का एक ही काम है, तो उसे चालू या बंद करना आसान होता है. उदाहरण के लिए:

स्टैक में कॉलबैक का क्रम.
दूसरी इमेज. कॉलबैक स्टैक का डायग्राम.

दूसरे फ़िगर में दिखाया गया है कि स्टैक में कई कॉलबैक कैसे हो सकते हैं. इनमें से हर कॉलबैक, एक काम के लिए ज़िम्मेदार होता है. कोई कॉलबैक सिर्फ़ तब चलता है, जब स्टैक में मौजूद उसके ऊपर के कॉलबैक बंद हों. इस उदाहरण में, जब उपयोगकर्ता किसी फ़ॉर्म में डेटा डालता है, तब "क्या आपको पक्का करना है..." कॉलबैक चालू होता है. ऐसा न करने पर, यह बंद हो जाता है. जब उपयोगकर्ता फ़ॉर्म से बाहर निकलने के लिए वापस स्वाइप करता है, तब यह कॉलबैक पुष्टि करने वाला डायलॉग बॉक्स खोलता है.

दूसरे कॉलबैक में, पीछे जाने पर झलक दिखाने की सुविधा के साथ काम करने वाला कोई मटीरियल कॉम्पोनेंट, प्रोग्रेस एपीआई का इस्तेमाल करने वाला AndroidX ट्रांज़िशन या कोई अन्य कस्टम कॉलबैक शामिल हो सकता है.

Compose में भी स्टैक का यही तरीका लागू होता है: सबसे अंदरूनी PredictiveBackHandler या BackHandler को प्राथमिकता दी जाती है.

इसी तरह, अगर ऊपर दिए गए कॉलबैक बंद हैं और इस FragmentManager का बैक स्टैक खाली नहीं है, तो childFragmentManager का कॉलबैक चलता है. इस उदाहरण में, इस इंटरनल कॉलबैक को बंद कर दिया गया है.

इसी तरह, अगर ऊपर दिए गए कॉलबैक बंद हैं और इसका स्टैक खाली नहीं है, तो supportFragmentManager का इंटरनल कॉलबैक चलता है. इस उदाहरण में, यह कॉलबैक तब चलता है, जब उपयोगकर्ता ने फ़ॉर्म में टेक्स्ट नहीं डाला होता है. इसकी वजह से, "क्या आपको पक्का करना है..." कॉलबैक बंद हो जाता है.

आखिर में, अगर ऊपर दिए गए कॉलबैक बंद हैं, तो सिस्टम बैक जेस्चर को हैंडल करता है. होम पेज पर वापस जाने, ऐप्लिकेशन में मौजूद अलग-अलग गतिविधि देखने, और अलग-अलग ऐप्लिकेशन पर काम करने जैसे सिस्टम ऐनिमेशन ट्रिगर करने के लिए, supportFragmentManager का बैक स्टैक खाली होना चाहिए, ताकि इसका इंटरनल कॉलबैक बंद हो जाए.

पीछे जाने पर झलक दिखाने वाले हाथ के जेस्चर के ऐनिमेशन की जांच करना

अगर अब भी Android 13 या Android 14 का इस्तेमाल किया जा रहा है, तो इमेज 1 में दिखाया गया 'होम स्क्रीन पर वापस जाएं' ऐनिमेशन टेस्ट किया जा सकता है.

इस ऐनिमेशन को आज़माने के लिए, यह तरीका अपनाएं:

  1. अपने डिवाइस पर, सेटिंग > सिस्टम > डेवलपर के लिए सेटिंग और टूल पर जाएं.

  2. प्रिडिक्टिव बैक ऐनिमेशन चुनें.

  3. अपडेट किया गया ऐप्लिकेशन लॉन्च करें और इसे आज़माने के लिए, वापस जाने वाले जेस्चर का इस्तेमाल करें.