Search code examples
javaandroidandroid-viewpager

How to change toolbar title when tab changes(View Pager)?


I am trying to do something simple. But i don't know why it doesn't work. I'm just want to change the toolbar title to match the fragment on tab changes. But somehow it will get the wrong value. Like when i choose A it will set the title B. And sometimes the title won't changes at all. How can i do this? Thank you.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewPager = findViewById(R.id.viewpager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        TabLayout tabLayout = findViewById(R.id.tabs);
        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));

        navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    //toolbar.setTitle(R.string.home);
                    FragmentMainHome fragmentMainHome = new FragmentMainHome();
                    return fragmentMainHome;
                case 1:
                    //toolbar.setTitle(R.string.activities);
                    FragmentMainActivities fragmentMainActivities = new FragmentMainActivities();
                    return fragmentMainActivities;
                case 2:
                    //toolbar.setTitle(R.string.people);
                    FragmentMainPeople fragmentMainPeople = new FragmentMainPeople();
                    return fragmentMainPeople;
                case 3:
                    //toolbar.setTitle(R.string.posts);
                    FragmentMainPosts fragmentMainPosts = new FragmentMainPosts();
                    return fragmentMainPosts;
                case 4:
                    //toolbar.setTitle(R.string.media);
                    FragmentMainMedia fragmentMainMedia = new FragmentMainMedia();
                    return fragmentMainMedia;

            }
            return null;
        }

        @Override
        public int getCount() {
            // Show total pages.
            return 5;
        }
    }

Solution

  • Use addOnPageChangeListener:

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
    
            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        toolbar.setTitle(R.string.home);
                        break;
                    case 1:
                        toolbar.setTitle(R.string.activities);
                        break;
                    case 2:
                        toolbar.setTitle(R.string.people);
                        break;
                    case 3:
                        toolbar.setTitle(R.string.posts);
                        break;
                    case 4:
                        toolbar.setTitle(R.string.media);
                        break;
                }
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {}
        });