0

I'm stuck with an issue that should be super simple. I just want to know what fragment position I'm on when I'm on it so I can change toolbar title, this should be simple - but I've used my whole morning trying to figure it out

Not working, returning wrong numbers:

FragmentStatePagerAdapter

Unknown to support crap

getChildFragmentManager

Returns the wrong number..

getItem(int position)

My code:

import android.content.Context;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.AttributeSet;

import java.util.ArrayList;

import z.R;
import z.common.BaseFragment;
import z.common.ToolBar;
import z.utility.IntegerIncrementer;
import z.utility.Logger;

public class MainUIViewPager extends ViewPager {

    private ArrayList<Tab> uiTabs = new ArrayList<>();

    private ToolBar mainUiToolBar;

    public MainUIViewPager(Context context) {
        super(context);
    }

    public MainUIViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void init(AppCompatActivity activity) {

        // Make tabs
        IntegerIncrementer integerIncrementer = new IntegerIncrementer(0);
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_latest_changes, getResources().getString(R.string.tab_latest_changes), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_tasks, getResources().getString(R.string.tab_tasks), new FragmentTasks()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_events, getResources().getString(R.string.tab_events), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_messages, getResources().getString(R.string.tab_messages), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_more, getResources().getString(R.string.tab_more), new FragmentLatestChanges()));

        // Create the adapter that will return a fragments
        this.setAdapter(new SectionsPagerAdapter(activity.getSupportFragmentManager()));

        // Setup tab layout with icons and this view pager.
        TabLayout tabLayout = (TabLayout) activity.findViewById(R.id.main_ui_tabs);
        tabLayout.setupWithViewPager(this);
        for (Tab tab : uiTabs) {
            tabLayout.getTabAt(tab.getPosition()).setIcon(tab.getDrawableResource());
        }

        mainUiToolBar = (ToolBar) activity.findViewById(R.id.main_ui_toolbar);
        mainUiToolBar.setTitle(uiTabs.get(0).getTitle());

        //TODO Remove, replaces the interface callback from SectionsPagerAdapter so nothing gets called..... why is android so crappy
        /*
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                Logger.logInfo("onTabSelected:" + tab.getPosition());
                mainUiToolBar.setTitle(uiTabs.get(tab.getPosition()).getTitle());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {}
            @Override
            public void onTabReselected(TabLayout.Tab tab) {}
        });
        */

    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).

            Logger.logInfo("Getting tab of: " + String.valueOf(position));

            //mainUiToolBar.setTitle(uiTabs.get(position).getTitle());

            return uiTabs.get(position).getBaseFragment();
        }



        @Override
        public CharSequence getPageTitle(int position) {
            // We don't want to display a tab title, setting null stops the view from being displayed here. Android design pattern.
            return null;
        }

        @Override
        public int getCount() {
            return uiTabs.size();
        }
    }

    private class Tab {
        private int position;
        private int drawableResource;
        private String title;
        private BaseFragment baseFragment;

        public Tab(int position, int drawableResource, String title, BaseFragment baseFragment) {
            this.position = position;
            this.title = title;
            this.drawableResource = drawableResource;
            this.baseFragment = baseFragment;
        }

        public int getPosition() {
            return position;
        }

        public int getDrawableResource() {
            return drawableResource;
        }

        public String getTitle() {
            return title;
        }

        public BaseFragment getBaseFragment() {
            return baseFragment;
        }
    }
}
Oliver Dixon
  • 7,012
  • 5
  • 61
  • 95

2 Answers2

0

Found an easy solution that doesn't involve loads of hacks and dodge code like the solutions I've found before.

Simple do this:

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                Logger.logInfo("onTabSelected:" + tab.getPosition());
                mainUiToolBar.setTitle(uiTabs.get(tab.getPosition()).getTitle());

                // This is how the tab is changed manually.
                setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {}
            @Override
            public void onTabReselected(TabLayout.Tab tab) {}
        });
Oliver Dixon
  • 7,012
  • 5
  • 61
  • 95
-1

If I understand well what you're asking:

FragmentManager manager = getFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
int countFragments = manager.getBackStackEntryCount();
for( int i = 0; i< countFragments; i++ ) {
    BackStackEntry entry = manager.getBackStackEntryAt(i);
        if( entry != null ) {
            if( entry.getName() != null ) {
                Fragment f = (Fragment) manager.findFragmentByTag(manager.getBackStackEntryAt(i).getName());
                if( f instanceof MyFisrtFragmentClass ){ 
                    //do something  
                }else if( f instanceof MySecondFragmentClass){ 
                    //do something  
                }
            }
        }}
    }
    ft.commit();
}

Hope it helps

Nicolas Cortell
  • 659
  • 4
  • 16
  • Just a question, why are we commiting the fragment again? How do I get the name/position here? – Oliver Dixon Feb 04 '16 at 08:31
  • You don't have to commit it again, but if in your "do something" you add or replace a new fragment it could be helpful (if you don't need it dont use it). You get the name of the fragment when you're able to find the type of instance the current fragment is. – Nicolas Cortell Feb 04 '16 at 08:36
  • I just want the position of the current fragment though – Oliver Dixon Feb 04 '16 at 08:39