Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2011 The Android Open Source Project
   * Copyright (C) 2011 Jake Wharton
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.viewpagerindicator;
 
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;

This widget implements the dynamic action bar tab behavior that can change across different configurations or circumstances.
 
 public class TabPageIndicator extends HorizontalScrollView implements PageIndicator {
    
Title text used when no title is provided by the adapter.
 
     private static final CharSequence EMPTY_TITLE = "";

    
Interface for a callback when the selected tab has been reselected.
 
     public interface OnTabReselectedListener {
        
Callback when the selected tab has been reselected.

Parameters:
position Position of the current center item.
 
         void onTabReselected(int position);
     }
 
     private Runnable mTabSelector;
 
     private final OnClickListener mTabClickListener = new OnClickListener() {
         public void onClick(View view) {
             TabView tabView = (TabView)view;
             final int oldSelected = .getCurrentItem();
             final int newSelected = tabView.getIndex();
             .setCurrentItem(newSelected);
             if (oldSelected == newSelected &&  != null) {
                 .onTabReselected(newSelected);
             }
         }
     };
 
     private final IcsLinearLayout mTabLayout;
 
     private ViewPager mViewPager;
 
     private int mMaxTabWidth;
     private int mSelectedTabIndex;
 
 
     public TabPageIndicator(Context context) {
         this(contextnull);
     }
 
     public TabPageIndicator(Context contextAttributeSet attrs) {
         super(contextattrs);
         setHorizontalScrollBarEnabled(false);
 
          = new IcsLinearLayout(context..);
     }
 
     public void setOnTabReselectedListener(OnTabReselectedListener listener) {
          = listener;
     }
 
     @Override
     public void onMeasure(int widthMeasureSpecint heightMeasureSpec) {
         final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
         final boolean lockedExpanded = widthMode == .;
         setFillViewport(lockedExpanded);
 
         final int childCount = .getChildCount();
        if (childCount > 1 && (widthMode == . || widthMode == .)) {
            if (childCount > 2) {
                 = (int)(MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
            } else {
                 = MeasureSpec.getSize(widthMeasureSpec) / 2;
            }
        } else {
             = -1;
        }
        final int oldWidth = getMeasuredWidth();
        super.onMeasure(widthMeasureSpecheightMeasureSpec);
        final int newWidth = getMeasuredWidth();
        if (lockedExpanded && oldWidth != newWidth) {
            // Recenter the tab display if we're at a new (scrollable) size.
            setCurrentItem();
        }
    }
    private void animateToTab(final int position) {
        final View tabView = .getChildAt(position);
        if ( != null) {
            removeCallbacks();
        }
         = new Runnable() {
            public void run() {
                final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2;
                smoothScrollTo(scrollPos, 0);
                 = null;
            }
        };
        post();
    }
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        if ( != null) {
            // Re-post the selector we saved
            post();
        }
    }
    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if ( != null) {
            removeCallbacks();
        }
    }
    private void addTab(int indexCharSequence textint iconResId) {
        final TabView tabView = new TabView(getContext());
        tabView.mIndex = index;
        tabView.setFocusable(true);
        tabView.setOnClickListener();
        tabView.setText(text);
        if (iconResId != 0) {
            tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
        }
        .addView(tabViewnew LinearLayout.LayoutParams(0, , 1));
    }
    @Override
    public void onPageScrollStateChanged(int arg0) {
        if ( != null) {
            .onPageScrollStateChanged(arg0);
        }
    }
    @Override
    public void onPageScrolled(int arg0float arg1int arg2) {
        if ( != null) {
            .onPageScrolled(arg0arg1arg2);
        }
    }
    @Override
    public void onPageSelected(int arg0) {
        setCurrentItem(arg0);
        if ( != null) {
            .onPageSelected(arg0);
        }
    }
    @Override
    public void setViewPager(ViewPager view) {
        if ( == view) {
            return;
        }
        if ( != null) {
            .setOnPageChangeListener(null);
        }
        final PagerAdapter adapter = view.getAdapter();
        if (adapter == null) {
            throw new IllegalStateException("ViewPager does not have adapter instance.");
        }
         = view;
        view.setOnPageChangeListener(this);
        notifyDataSetChanged();
    }
    public void notifyDataSetChanged() {
        .removeAllViews();
        PagerAdapter adapter = .getAdapter();
        IconPagerAdapter iconAdapter = null;
        if (adapter instanceof IconPagerAdapter) {
            iconAdapter = (IconPagerAdapter)adapter;
        }
        final int count = adapter.getCount();
        for (int i = 0; i < counti++) {
            CharSequence title = adapter.getPageTitle(i);
            if (title == null) {
                title = ;
            }
            int iconResId = 0;
            if (iconAdapter != null) {
                iconResId = iconAdapter.getIconResId(i);
            }
            addTab(ititleiconResId);
        }
        if ( > count) {
             = count - 1;
        }
        requestLayout();
    }
    @Override
    public void setViewPager(ViewPager viewint initialPosition) {
        setViewPager(view);
        setCurrentItem(initialPosition);
    }
    @Override
    public void setCurrentItem(int item) {
        if ( == null) {
            throw new IllegalStateException("ViewPager has not been bound.");
        }
         = item;
        .setCurrentItem(item);
        final int tabCount = .getChildCount();
        for (int i = 0; i < tabCounti++) {
            final View child = .getChildAt(i);
            final boolean isSelected = (i == item);
            child.setSelected(isSelected);
            if (isSelected) {
                animateToTab(item);
            }
        }
    }
    @Override
    public void setOnPageChangeListener(OnPageChangeListener listener) {
         = listener;
    }
    private class TabView extends TextView {
        private int mIndex;
        public TabView(Context context) {
            super(contextnull..);
        }
        @Override
        public void onMeasure(int widthMeasureSpecint heightMeasureSpec) {
            super.onMeasure(widthMeasureSpecheightMeasureSpec);
            // Re-measure if we went beyond our maximum size.
            if ( > 0 && getMeasuredWidth() > ) {
                super.onMeasure(MeasureSpec.makeMeasureSpec(.),
                        heightMeasureSpec);
            }
        }
        public int getIndex() {
            return ;
        }
    }