Android Open Source - AndroidNavigationDrawerSample Sliding Tab Layout






From Project

Back to project page AndroidNavigationDrawerSample.

License

The source code is released under:

Apache License

If you think the Android project AndroidNavigationDrawerSample listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 The Android Open Source Project
 *//w w w .j av a2  s  .c o m
 * 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 de.dev.eth0.android.sample.navigationDrawer.view.slidingtab;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Build;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.TextView;

/**
 * Sliding Tabs Layout, based on example from Android SDK
 *
 * @author deveth0
 */
public class SlidingTabLayout extends HorizontalScrollView {

  public static final int DEFAULT_COLOR_INDICATOR = Color.WHITE;


  private static final int TITLE_OFFSET_DIPS = 24;
  private static final int TAB_VIEW_PADDING_DIPS = 16;
  private static final int TAB_VIEW_TEXT_SIZE_SP = 14;

  private int mTitleOffset;
  private int mActiveTab = 0;

  private int mTabViewLayoutId;
  private int mTabViewTextViewId;

  private ViewPager mViewPager;
  private ViewPager.OnPageChangeListener mViewPagerPageChangeListener;

  private final SlidingTabStrip mTabStrip;

  public SlidingTabLayout(Context context) {
    this(context, null);
  }

  public SlidingTabLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    // Disable the Scroll Bar
    setHorizontalScrollBarEnabled(false);
    // Make sure that the Tab Strips fills this View
    setFillViewport(true);

    mTitleOffset = (int)(TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density);

    mTabStrip = new SlidingTabStrip(context);
    addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
  }

  /**
   * Sets the associated view pager. Note that the assumption here is that the pager content (number of tabs and tab titles) does not change after this call has
   * been made.
   *
   * @param viewPager
   */
  public void setViewPager(ViewPager viewPager) {
    mTabStrip.removeAllViews();

    mViewPager = viewPager;
    if (viewPager != null) {
      viewPager.setOnPageChangeListener(new InternalViewPagerListener());
      populateTabStrip();
    }
  }

  /**
   * Creates the textview for a single entry.
   *
   * @param context
   * @param isActive
   * @return the textview
   */
  protected TextView createTabView(Context context, boolean isActive) {
    TextView textView = new TextView(context);
    textView.setGravity(Gravity.CENTER);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
    textView.setTypeface(Typeface.DEFAULT_BOLD);
    textView.setTextColor(Color.WHITE);
    if (!isActive) {
      textView.setAlpha(0.5f);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      // If we're running on Honeycomb or newer, then we can use the Theme's
      // selectableItemBackground to ensure that the View has a pressed state
      TypedValue outValue = new TypedValue();
      getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
              outValue, true);
      textView.setBackgroundResource(outValue.resourceId);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
      // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
      textView.setAllCaps(true);
    }

    int padding = (int)(TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
    textView.setPadding(padding, padding, padding, padding);

    return textView;
  }

  /**
   * Initially populate the tabstrip, creates a textview for each entry
   */
  private void populateTabStrip() {
    final PagerAdapter adapter = mViewPager.getAdapter();
    final View.OnClickListener tabClickListener = new TabClickListener();

    for (int i = 0; i < adapter.getCount(); i++) {
      View tabView = null;
      TextView tabTitleView = null;

      if (mTabViewLayoutId != 0) {
        // If there is a custom tab view layout id set, try and inflate it
        tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip,
                false);
        tabTitleView = (TextView)tabView.findViewById(mTabViewTextViewId);
      }

      if (tabView == null) {
        tabView = createTabView(getContext(), mActiveTab == i);
      }

      if (tabTitleView == null && TextView.class.isInstance(tabView)) {
        tabTitleView = (TextView)tabView;
        tabTitleView.setText(adapter.getPageTitle(i));
      }

      tabView.setOnClickListener(tabClickListener);
      mTabStrip.addView(tabView);
    }
  }

  @Override
  protected void onAttachedToWindow() {
    super.onAttachedToWindow();

    if (mViewPager != null) {
      scrollToTab(mViewPager.getCurrentItem(), 0);
    }
  }

  /**
   * scroll to the selected tab
   *
   * @param tabIndex
   * @param positionOffset
   */
  private void scrollToTab(int tabIndex, int positionOffset) {
    final int tabStripChildCount = mTabStrip.getChildCount();
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
      return;
    }

    View selectedChild = mTabStrip.getChildAt(tabIndex);
    if (selectedChild != null) {
      int targetScrollX = selectedChild.getLeft() + positionOffset;

      if (tabIndex > 0 || positionOffset > 0) {
        // If we're not at the first child and are mid-scroll, make sure we obey the offset
        targetScrollX -= mTitleOffset;
      }
      // update textviews of old selected and new (alpha)
      View oldSelected = mTabStrip.getChildAt(mActiveTab);
      if (tabIndex != mActiveTab && TextView.class.isInstance(selectedChild) && TextView.class.isInstance(oldSelected)) {
        TextView tv = (TextView)selectedChild;
        TextView old = (TextView)oldSelected;
        tv.setAlpha(1f);
        old.setAlpha(0.5f);
        mActiveTab = tabIndex;
      }
      scrollTo(targetScrollX, 0);
    }
  }

  private class InternalViewPagerListener implements ViewPager.OnPageChangeListener {

    private int mScrollState;

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
      int tabStripChildCount = mTabStrip.getChildCount();
      if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) {
        return;
      }

      mTabStrip.onViewPagerPageChanged(position, positionOffset);

      View selectedTitle = mTabStrip.getChildAt(position);
      int extraOffset = (selectedTitle != null)
              ? (int)(positionOffset * selectedTitle.getWidth())
              : 0;
      scrollToTab(position, extraOffset);

      if (mViewPagerPageChangeListener != null) {
        mViewPagerPageChangeListener.onPageScrolled(position, positionOffset,
                positionOffsetPixels);
      }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
      mScrollState = state;

      if (mViewPagerPageChangeListener != null) {
        mViewPagerPageChangeListener.onPageScrollStateChanged(state);
      }
    }

    @Override
    public void onPageSelected(int position) {
      if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
        mTabStrip.onViewPagerPageChanged(position, 0f);
        scrollToTab(position, 0);
      }

      if (mViewPagerPageChangeListener != null) {
        mViewPagerPageChangeListener.onPageSelected(position);
      }
    }

  }

  private class TabClickListener implements View.OnClickListener {

    @Override
    public void onClick(View v) {
      for (int i = 0; i < mTabStrip.getChildCount(); i++) {
        if (v == mTabStrip.getChildAt(i)) {
          mViewPager.setCurrentItem(i);
          return;
        }
      }
    }
  }

}




Java Source Code List

de.dev.eth0.android.sample.navigationDrawer.NavigationDrawerApplication.java
de.dev.eth0.android.sample.navigationDrawer.navigation.NavigationDrawerPagerAdapter.java
de.dev.eth0.android.sample.navigationDrawer.navigation.SlidingTabsPagerAdapter.java
de.dev.eth0.android.sample.navigationDrawer.ui.AboutActivity.java
de.dev.eth0.android.sample.navigationDrawer.ui.AbstractBaseActivity.java
de.dev.eth0.android.sample.navigationDrawer.ui.MainActivity.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.AboutFragment.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.AbstractSlidingTabsFragment.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.Fragment1.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.Fragment2.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.Fragment3.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.Fragment4.java
de.dev.eth0.android.sample.navigationDrawer.ui.fragments.MainFragment.java
de.dev.eth0.android.sample.navigationDrawer.view.slidingtab.SlidingTabLayout.java
de.dev.eth0.android.sample.navigationDrawer.view.slidingtab.SlidingTabStrip.java