Search code examples
androidbottomnavigationview

How to change icon of bottom navigation toolbar on loading previous fragment


How can i use bottomNavigationView when i click its moving perfectly but when i press back button fragment change to previous fragment but icon of bottomNavigationView not changed

private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment selectedFragment = null;



        switch (item.getItemId()) {
            case R.id.nav_home:
                selectedFragment = new HomeFragment();
                break;
            case R.id.nav_fav:
                selectedFragment = new Fragment();
                break;
            case R.id.nav_search:
                selectedFragment = new SearchFragment();
                break;
        }


        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).addToBackStack(null).commit();
        return true;
    }
}; 

It's change fragment when i click back but not icon so please help me


Solution

  • For pages with BpttomNavigation and Fragments i suggest using ViewPager

    Benifits of ViewPager : flexibility, controllability, performance, cleaner code and nice swip animation on fragment change, and on finger swip.

    in order to achieve your desired result, you can use something like this :

    • put your ViewPager above the BpttomNavigation :

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent">
      
      <!-- Doesn't need any addition -->
      <android.support.v4.view.ViewPager 
              android:layout_above="@id/bottomNavigation"
              android:layout_width="match_parent"
              android:id="@+id/viewPager"                           
              android:layout_height="match_parent"/>
      
      <!-- Set up menu and stuff -->
      <android.support.design.widget.BottomNavigationView
              android:id="@+id/bottomNavigation"
              android:layout_alignParentBottom="true"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"/>
      
      </RelativeLayout>
      
    • create your ViewPagerFragmentAdapter :

      public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
      
      private ArrayList<Fragment> fragments;
      
      public ViewPagerFragmentAdapter(FragmentManager fragmentManager, ArrayList<Fragment> fragments) { 
          super(fragmentManager);
          this.fragments = fragments;
      }
      
      //Returns fragment by position
      @Override
      public Fragment getItem(int position) {
          return fragments.get(position);
      }
      
      //Returns fragment count
      @Override
      public int getCount() {
          return fragments.size();
      }
      }
      
    • set up your views, fragments and adapter :

       @Override
         protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          //Initialize views
          final ViewPager viewPager = findViewById(R.id.viewPager);
          final BottomNavigationView navigationView = findViewById(R.id.bottomNavigation);
      
          //Initialize fragments list
          ArrayList fragmentsArray = new ArrayList<Fragment>();
          fragmentsArray.add(new FirstFragment());
          fragmentsArray.add(new SecondFragment());
          fragmentsArray.add(new ThirdFragment());
      
          //Initialize adapter and attach it to view pager
          ViewPagerFragmentAdapter adapterViewPager = new ViewPagerFragmentAdapter(
                  getSupportFragmentManager(),
                  fragmentsArray
                  );
      
          viewPager.setAdapter(adapterViewPager);
      }
      

    Your magic comes here, set up the listeners :

    • ViewPager page selection listener (swip or whatever) :

      viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
          @Override
          public void onPageScrolled(int position, float v, int i1) { }
      
          @Override
          public void onPageSelected(int position) {
              //Here goes the magic
              switch (position) {
                  case 0:
                      navigationView.setSelectedItemId(R.id.menu_first_fragment);
                      break;
                  case 1:
                      navigationView.setSelectedItemId(R.id.menu_second_fragment);
                      break;
                  case 2:
                      navigationView.setSelectedItemId(R.id.menu_third_fragment);
                      break;
                  default:
                      //Handle exception
                      break;
              }
          }
          @Override
          public void onPageScrollStateChanged(int position) { }
      });
      
    • BottomNavigation item selection listener :

      navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
          @Override
          public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
              switch (menuItem.getItemId()) {
                  case R.id.menu_first_fragment:
                      viewPager.setCurrentItem(0);
                      break;
                  case R.id.menu_second_fragment:
                      viewPager.setCurrentItem(1);
                      break;
                  case R.id.menu_third_fragment:
                      viewPager.setCurrentItem(2);
                      break;
                  default: return false;
                      break;
              }
              //I'm not sure if you should return true or false but you can try
              return true;
          }
      
      });
      
    • Finally, to select the last fragment onBackPressed() you should keep it's position in a variable and call viewPager.setCurrentItem(lastFragmentPosition);, the listener will be automatically triggered, and sets NavigationView correct item,

      • you can check if lastFragmentPostion equales viewPager.getCurrentItem(); to exit the activity or the app.

    I haven't worked with java for a long time but i believe this code contains no errors.

    Note : You can initialize your fragments directly in your adapter in getItem(position) method if you want to return a new instance of the fragment every time this method is called, in this case you won't need the ArrayList in your constructor, don't forget to return the number of fragments in getCount() method

    Happy coding!