Fragment re-created on bottom navigation view item selected

后端 未结 15 2551
长发绾君心
长发绾君心 2020-12-07 23:55

Following is my code for bottom navigation view item selected

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationI         


        
15条回答
  •  感情败类
    2020-12-08 00:33

    I solved this problem by adding a ViewPager to which I delegated all my navigation fragments. Its adapter (FragmentPagerAdapter) doesn't recreate the fragments instances when the user navigates through the BotoomNavigationView.

    To achieve this, you have to complete 5 easy steps:

    1. add a ViewPager to your layout;
    2. implement its adapter:

      class YourNavigationViewPagerAdapter(fm: FragmentManager,
                                           private val param1: Int,
                                           private val param2: Int)
      
          : FragmentPagerAdapter(fm) {
      
          override fun getItem(p0: Int) = when(p0) {
              0 -> NavigationFragment1.newInstance(param1, param2)
              1 -> NavigationFragment2.newInstance(param1, param2)
              2 -> NavigationFragment3.newInstance(param1, param2)
              else -> null
          }
      
          override fun getCount() = 3
      }
      
    3. don't forget to set the new adapter:

      yourViewPager.adapter = YourNavigationViewPagerAdapter(supportFragmentManager, param1, param2)
      
    4. set a OnNavigationItemSelectedListener to your BottomNavigationView like the following:

      yourBottomNavigationView.setOnNavigationItemSelectedListener {
      
          when(it.itemId) {
      
              R.id.yourFirstFragmentMenuItem -> {
                  yourViewPager.currentItem = 0
                  true
              }
      
              R.id.yourSecondFragmentMenuItem -> {
                  yourViewPager.currentItem = 1
                  true
              }
      
              R.id.yourThirdFragmentMenuItem -> {
                  yourViewPager.currentItem = 2
                  true
              }
      
      
              else -> false
          }
      }
      
    5. set a OnPageChangeListener to your ViewPager like the following:

      yourViewPager.addOnPageChangeListener(object : 
      ViewPager.OnPageChangeListener {
          override fun onPageScrollStateChanged(p0: Int) {
      
          }
      
          override fun onPageScrolled(p0: Int, p1: Float, p2: Int) {
      
          }
      
          override fun onPageSelected(p0: Int) {
              yourBottomNavigationView.menu.getItem(p0).isChecked = true
          }
      
      })
      
    6. enjoy :)

提交回复
热议问题