वापस जाने के लिए कस्टम नेविगेशन की सुविधा दें

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

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

Compose में, पीछे जाने के लिए कस्टम नेविगेशन लागू करना

Jetpack Compose में, पीछे जाने के लिए कस्टम नेविगेशन को मैनेज किया जा सकता है. BackHandler

Navigation Compose का इस्तेमाल करते समय, आम तौर पर NavController.navigateUp() या NavController.popBackStack() का इस्तेमाल करके, बैक स्टैक में पिछली स्क्रीन पर नेविगेट किया जाता है. हालांकि, BackHandler उन मामलों के लिए काम का है जहां आपको सिस्टम के 'वापस जाएं' बटन दबाने या पीछे जाने के लिए जेस्चर का इस्तेमाल करने पर, अपनी ज़रूरत के हिसाब से व्यवहार लागू करना हो. उदाहरण के लिए, अगर आपके ऐप्लिकेशन में WebView दिख रहा है, तो हो सकता है कि आपको उपयोगकर्ताओं को सिस्टम के 'वापस जाएं' बटन दबाने पर, ब्राउज़िंग इतिहास में वापस जाने की अनुमति देनी हो.

बुनियादी इस्तेमाल

यहां एक उदाहरण दिया गया है, जिसमें दिखाया गया है कि कस्टम स्थिति को कंट्रोल करने के लिए, पीछे जाने के इवेंट को कैसे इंटरसेप्ट किया जाता है. जैसे, किसी पैनल को कोलैप्स करना:

@Composable
fun MyScreen() {
    var isExpanded by remember { mutableStateOf(false) }

    // Intercept the back button or gesture only when isExpanded is true
    BackHandler(enabled = isExpanded) {
        // Collapsing the content disables this handler, so it does not
        // receive the next back event.
        isExpanded = false
    }

    if (isExpanded) {
        Text("Expanded content. Go back to collapse it.")
    } else {
        Button(onClick = { isExpanded = true }) {
            Text("Expand")
        }
    }
}

कंपोज़ेबल ट्री इंटरसेप्शन

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

Views के साथ, पीछे जाने के लिए कस्टम नेविगेशन लागू करना

ComponentActivity, FragmentActivity और AppCompatActivity के लिए बेस क्लास है. इसकी मदद से, 'वापस जाएं' बटन के व्यवहार को कंट्रोल किया जा सकता है . इसके लिए, OnBackPressedDispatcher का इस्तेमाल किया जाता है. इसे getOnBackPressedDispatcher() को कॉल करके वापस पाया जा सकता है.

OnBackPressedDispatcher कंट्रोल करता है कि 'वापस जाएं' बटन के इवेंट, एक या उससे ज़्यादा OnBackPressedCallback ऑब्जेक्ट को कैसे भेजे जाते हैं. OnBackPressedCallback के कंस्ट्रक्टर में, शुरुआती चालू स्थिति के लिए बूलियन वैल्यू ली जाती है. जब कोई कॉलबैक चालू होता है, तब डिस्पैचर, 'वापस जाएं' बटन के इवेंट को मैनेज करने के लिए, कॉलबैक के handleOnBackPressed() को कॉल करता है. उदाहरण के लिए, जब isEnabled() की वैल्यू true होती है. ` setEnabled()` को कॉल करके, चालू स्थिति को बदला जा सकता है.

addCallback तरीकों का इस्तेमाल करके, कॉलबैक जोड़े जाते हैं. addCallback() तरीके का इस्तेमाल करें, जो LifecycleOwner लेता है. इस तरह, OnBackPressedCallback सिर्फ़ तब जोड़ा जाता है, जब LifecycleOwner की वैल्यू Lifecycle.State.STARTED होती है. जब उनसे जुड़ा LifecycleOwner डिस्ट्रॉय हो जाता है, तब ऐक्टिविटी, रजिस्टर किए गए कॉलबैक को भी हटा देती है. इससे मेमोरी लीक नहीं होती और फ़्रैगमेंट या अन्य लाइफ़साइकल ओनर में इसका इस्तेमाल किया जा सकता है. इनकी लाइफ़टाइम, ऐक्टिविटी से कम होती है.

यहां कॉलबैक लागू करने का एक उदाहरण दिया गया है:

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

addCallback() का इस्तेमाल करके, एक से ज़्यादा कॉलबैक दिए जा सकते हैं. ऐसा करने पर, कॉलबैक को जोड़ने के उल्टे क्रम में लागू किया जाता है. यानी, सबसे आखिर में जोड़े गए कॉलबैक को, 'वापस जाएं' बटन के इवेंट को मैनेज करने का पहला मौका मिलता है. उदाहरण के लिए, अगर आपने one, two और three नाम के तीन कॉलबैक क्रम से जोड़े हैं, तो उन्हें क्रमशः three, two और one के क्रम में लागू किया जाएगा.

कॉलबैक, चेन ऑफ़ रिस्पॉन्सिबिलिटी पैटर्न को फ़ॉलो करते हैं. चेन में मौजूद हर कॉलबैक को सिर्फ़ तब लागू किया जाता है, जब उससे पहले वाला कॉलबैक चालू न हो. इसका मतलब है कि ऊपर दिए गए उदाहरण में, कॉलबैक two को सिर्फ़ तब लागू किया जाएगा, जब कॉलबैक three चालू न हो. कॉलबैक one को सिर्फ़ तब लागू किया जाएगा, जब कॉलबैक two चालू न हो. यह पैटर्न, अन्य कॉलबैक के लिए भी जारी रहता है.

ध्यान दें कि addCallback() का इस्तेमाल करके जोड़ने पर, कॉलबैक को चेन ऑफ़ रिस्पॉन्सबिलिटी में तब तक नहीं जोड़ा जाता, जब तक LifecycleOwner Lifecycle.State.STARTED स्थिति में नहीं आ जाता.

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

अगर आपको कॉलबैक को पूरी तरह से हटाना है, तो कॉल करें remove(). आम तौर पर, इसकी ज़रूरत नहीं होती, क्योंकि उनसे जुड़ा LifecycleOwner डिस्ट्रॉय होने पर, कॉलबैक अपने-आप हट जाते हैं.