Android Jetpack Navigation, BottomNavigationView with Youtube or Instagram like proper back navigation (fragment back stack)?

前端 未结 13 2003
误落风尘
误落风尘 2020-12-12 10:25

Android Jetpack Navigation, BottomNavigationView with auto fragment back stack on back button click?

What I wanted, after choosing multiple tabs one after another by

13条回答
  •  轮回少年
    2020-12-12 11:04

    Originally answered here: https://stackoverflow.com/a/63645978/8956093

    In Jetpack Navigation Componenet, if you want to perform some operation when fragment is poped then you need to override following functions.

    1. Add OnBackPressedCallback in fragment to run your special operation when back is pressed present in system navigation bar at bottom.

       override fun onCreate(savedInstanceState: Bundle?) {
           super.onCreate(savedInstanceState)
      
           onBackPressedCallback = object : OnBackPressedCallback(true) {
               override fun handleOnBackPressed() {
                   //perform your operation and call navigateUp
                  findNavController().navigateUp()
               }
           }
       requireActivity().onBackPressedDispatcher.addCallback(onBackPressedCallback)
       }
      
    2. Add onOptionsItemMenu in fragment to handle back arrow press present at top left corner within the app.

       override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
           super.onViewCreated(view, savedInstanceState)
      
           setHasOptionsMenu(true)
       }
      
      override fun onOptionsItemSelected(item: MenuItem): Boolean {
         if (item.itemId == android.R.id.home) {
             //perform your operation and call navigateUp
             findNavController().navigateUp()
             return true
         }
         return super.onOptionsItemSelected(item)
      }
      
    3. If there is no special code to be run when back is pressed on host fragment then use onSupportNavigateUp in Activity.

       override fun onSupportNavigateUp(): Boolean {
         if (navController.navigateUp() == false){
           //navigateUp() returns false if there are no more fragments to pop
           onBackPressed()
         }
         return navController.navigateUp()
       }
      

    Note that onSupportNavigateUp() is not called if the fragment contains onOptionsItemSelected()

提交回复
热议问题