Search code examples
androidactionbarsherlock

Getting the current fragment position using state pager of actionbarsherlock


I have a working state pager project using actionbarsherlock but I'm having trouble with getting the current fragment that was displayed. Is it possible to get the position of the current fragment?


Solution

  • Yes it is possible. If you are using a ViewPager you can do that :

    _viewPager.getCurrentItem();
    

    or that

    _pageListener = new PageListener();
    _viewPager.setOnPageChangeListener(_pageListener);
    

    and keep trace of current page with something like that :

    private int _currentPage;
    
        private static class PageListener extends SimpleOnPageChangeListener{
                public void onPageSelected(int position) {
                    Log.i(TAG, "page selected " + position);
                       _currentPage = position;
            }
        }
    

    Or else you can easily do that with a TabAdapter like this :

    public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
            private final Context               mContext;
            private final ActionBar             mActionBar;
            private final ViewPager             mViewPager;
            private final ArrayList<TabInfo>    mTabs   = new ArrayList<TabInfo>();
    
            static final class TabInfo {
                private final Class<?>  clss;
                private final Bundle    args;
    
                TabInfo(Class<?> _class, Bundle _args) {
    
                    clss = _class;
                    args = _args;
                }
            }
    
            public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
    
                super(activity.getSupportFragmentManager());
                mContext = activity;
                mActionBar = activity.getSupportActionBar();
                mViewPager = pager;
                mViewPager.setAdapter(this);
                mViewPager.setOnPageChangeListener(this);
            }
    
            public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
    
                TabInfo info = new TabInfo(clss, args);
                tab.setTag(info);
                tab.setTabListener(this);
                mTabs.add(info);
                mActionBar.addTab(tab);
                notifyDataSetChanged();
            }
    
            @Override
            public int getCount() {
    
                return mTabs.size();
            }
    
            @Override
            public Fragment getItem(int position) {
    
                TabInfo info = mTabs.get(position);
                return Fragment.instantiate(mContext, info.clss.getName(), info.args);
            }
    
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            public void onPageSelected(int position) {
    
                mActionBar.setSelectedNavigationItem(position);
                ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu();
            }
    
            public void onPageScrollStateChanged(int state) {
    
            }
    
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
    
                Object tag = tab.getTag();
                for (int i = 0; i < mTabs.size(); i++) {
                    if (mTabs.get(i) == tag) {
                        mViewPager.setCurrentItem(i);
                    }
                }
            }
    
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    
            }
    
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
    
            }
        }
    

    You only need to keep the current page with one/or two of the methods. For example in onTabSelected

    hope it helps you good luck