मैं एक साधारण नोट लेने वाला ऐप बना रहा हूं, मेरे पास नेविगेशन घटक के साथ 2 टुकड़े हैं, एक टुकड़े में नोट्स की एक सूची है और दूसरा एक नया नोट संपादित करने या बनाने के लिए है।

MainActivity में मैंने जोड़ा

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)

और फिर onSupportNavigateUp() को ओवरराइड करें

override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.host_fragment)
        return navController.navigateUp()
    }

NoteEditFragment में

requireActivity().onBackPressedDispatcher.addCallback(this) {
        saveOrUpdateNote(noteId, note)
    }

अब डिवाइस में "बैक बटन" दबाते समय यह सब अच्छी तरह से काम करता है, हालांकि onBackPressedDispatcher.addCallback() नोट ट्रिगर होता है जब मैं स्क्रीन के ऊपर बाईं ओर "अप बटन" दबाता हूं।

मेरा प्रश्न है : मैं अपने NoteEditFragment से इस अप बटन को कैसे संभालूं?

अग्रिम में धन्यवाद

6
Yasser Altamimi 24 अगस्त 2019, 08:07

3 जवाब

सबसे बढ़िया उत्तर

अंत में, मुझे इसका हल मिल गया।

पहले activity onCreate विधि में मुझे नेविगेशन को कनेक्ट करना था जैसे मैंने किया:

val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)

फिर भी MainActivity में onSupportNavigateUp() ओवरराइड करें:

override fun onSupportNavigateUp(): Boolean
{
    val navController = this.findNavController(R.id.host_fragment)
    return navController.navigateUp()
}

फिर Fragment onCreateView में मुझे विकल्प मेनू सक्षम करना था:

setHasOptionsMenu(true)

फिर fragment में मैंने onOptionsItemSelected को ओवरराइड किया:

override fun onOptionsItemSelected(item: MenuItem): Boolean
{
    // handle the up button here
    return NavigationUI.onNavDestinationSelected(item!!,
        view!!.findNavController())
            || super.onOptionsItemSelected(item)
}

नोट: मुझे लगता है कि यदि आपके पास एक से अधिक विकल्प मेनू हैं, तो मुझे लगता है कि आपको एक when (item) कथन करना होगा कि कौन सा विकल्प चुना गया है।

इसके अलावा अगर आप डिवाइस बैक बटन को हैंडल करना चाहते हैं तो आप अपने fragment onCreateViewMethod में ऐसा कर सकते हैं:

requireActivity().onBackPressedDispatcher.addCallback(this)
    {
        // handle back button

// change this line to whatever way you chose to navigate back          
findNavController().navigate(NoteEditFragmentDirections.actionNoteEditFragmentToNoteListFragment())
        }
9
Yasser Altamimi 25 अगस्त 2019, 05:29

मुझे लगता है कि स्वीकृत उत्तर थोड़ा गड़बड़ है। तो, मुझे एक साफ कोड मिला। यह मेरे उपयोग के मामले के लिए एकदम सही है क्योंकि डिवाइस बैक बटन दबाए जाने पर मुझे कुछ विशेष करने की आवश्यकता नहीं है। इसलिए, यहां समान आवश्यकताओं वाला कोई भी व्यक्ति मेरे कोड का पालन कर सकता है।

मेनएक्टिविटी के ऑनक्रिएट में:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val navController = findNavController(R.id.nav_host_fragment)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    // Check if androidx.navigation.ui.NavigationUI.setupActionBarWithNavController is imported
    // By default title in actionbar is used from the fragment label in navigation graph
    // To use the app name, remove label else if you want to add customized label specify it there
    setupActionBarWithNavController(this, navController, appBarConfiguration)

    ...

  }

फिर से, MainActivity में ही:

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.fragment)
    // Check if androidx.Navigation.ui navigateUp is imported and used
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}

मैंने बेहतर समझ के लिए टिप्पणियाँ जोड़ी हैं। अगर आपको लगता है कि उत्तर मददगार है तो कृपया अपवोट करें। शुक्रिया। हैप्पी डेवलपमेंट :)

संपादित करें 1: टुकड़ों में supportActionBar.setDisplayHomeAsUpEnabled(true) का उपयोग करने की आवश्यकता नहीं है। AppBarConfiguration इसका ख्याल रखेगा।

1
Rehan Dev 7 मार्च 2021, 08:40

यदि आप नोएक्शनबार थीम का उपयोग करते हैं और आप अपने टूलबार को फ्रैगमेंट के लिए एक्शनबार के रूप में उपयोग करना चाहते हैं, तो आप इस विधि का उपयोग कर सकते हैं

मेजबान गतिविधि में

override fun onSupportNavigateUp(): Boolean {
    return findNavController(R.id.navHostFragment).navigateUp()
}

टुकड़े के onCreateView में

(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
0
Nasser Ghodsian 23 जिंदा 2021, 12:28