karan agarwal
karan agarwal

Reputation: 5

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

Upvotes: 0

Views: 885

Answers (4)

H_K
H_K

Reputation: 60

I would prefer you do not use addToBackStack(null) in case of BottomNavigationBar and instead return to home fragment on onBackPressed();

For that, you can use

FragmentManager manager; Fragment frag = manager.findFragmentById(R.id.your_frame_layout);

and check the instanceof the object in frag variable

`if (frag instanceof HomeFragment) {
        super.onBackPressed();//Exits the app if home fragment
    } else {
        manager.beginTransaction().replace(R.id.frame_layout, new HomeFragment()).commit();
//returns to home fragment when user presses back button
        navigation.setSelectedItemId(R.id.navigation_home);
    }`

Upvotes: 0

Tamim Attafi
Tamim Attafi

Reputation: 2521

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!

Upvotes: 1

Monster Brain
Monster Brain

Reputation: 2119

I think you can set the selected Item like this,

BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setSelectedItemId(R.id.navigation_dashboard);

In case of back button pressing, you have keep track of the previous button id's for switching I think. In the viewpager, I think there's an automatic mechanism for it.

Upvotes: 0

ismail alaoui
ismail alaoui

Reputation: 6073

when you go back , try to do a performClick()

View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
view.performClick();

Upvotes: 0

Related Questions