public void setTabSelected(int position) {
   mSelectedTabIndex = position;
   final int tabCount = mTabLayout.getChildCount();
   for (int i = 0; i < tabCount; i++) {
     final View child = mTabLayout.getChildAt(i);
     final boolean isSelected = i == position;
     child.setSelected(isSelected);
     if (isSelected) {
       animateToTab(position);
     }
   }
 }
 public void notifyDataSetChanged() {
   mIconsLayout.removeAllViews();
   IconPagerAdapter iconAdapter = (IconPagerAdapter) mViewPager.getAdapter();
   int count = iconAdapter.getCount();
   for (int i = 0; i < count; i++) {
     ImageView view = new ImageView(getContext(), null, R.attr.vpiIconPageIndicatorStyle);
     view.setImageResource(iconAdapter.getIconResId(i));
     mIconsLayout.addView(view);
   }
   if (mSelectedIndex > count) {
     mSelectedIndex = count - 1;
   }
   setCurrentItem(mSelectedIndex);
   requestLayout();
 }
  @Override
  public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY;
    setFillViewport(lockedExpanded);

    final int childCount = mTabLayout.getChildCount();
    if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) {
      if (childCount > 2) {
        mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
      } else {
        mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2;
      }
    } else {
      mMaxTabWidth = -1;
    }

    final int oldWidth = getMeasuredWidth();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    final int newWidth = getMeasuredWidth();

    if (lockedExpanded && oldWidth != newWidth) {
      // Recenter the tab display if we're at a new (scrollable) size.
      setCurrentItem(mSelectedTabIndex);
    }
  }
 public void notifyDataSetChanged() {
   mTabLayout.removeAllViews();
   PagerAdapter adapter = mViewPager.getAdapter();
   IconPagerAdapter iconAdapter = null;
   if (adapter instanceof IconPagerAdapter) {
     iconAdapter = (IconPagerAdapter) adapter;
   }
   final int count = adapter.getCount();
   for (int i = 0; i < count; i++) {
     CharSequence title = adapter.getPageTitle(i);
     if (title == null) {
       title = EMPTY_TITLE;
     }
     int iconResId = 0;
     if (iconAdapter != null) {
       iconResId = iconAdapter.getIconResId(i);
     }
     addTab(i, title, iconResId);
   }
   if (mSelectedTabIndex > count) {
     mSelectedTabIndex = count - 1;
   }
   setCurrentItem(mSelectedTabIndex);
   requestLayout();
 }
  @Override
  public void setCurrentItem(int item) {
    if (mViewPager == null) {
      throw new IllegalStateException("ViewPager has not been bound.");
    }
    mSelectedTabIndex = item;
    mViewPager.setCurrentItem(item);

    final int tabCount = mTabLayout.getChildCount();
    for (int i = 0; i < tabCount; i++) {
      final View child = mTabLayout.getChildAt(i);
      final boolean isSelected = (i == item);
      child.setSelected(isSelected);
      if (isSelected) {
        animateToTab(item);
      }
    }
  }
 public void updateTab(int position) {
   ((TabView) mTabLayout.getChildAt(position)).update();
   if (mTabSpinner != null) {
     ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged();
   }
   if (mAllowCollapse) {
     requestLayout();
   }
 }
 public void removeAllTabs() {
   mTabLayout.removeAllViews();
   if (mTabSpinner != null) {
     ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged();
   }
   if (mAllowCollapse) {
     requestLayout();
   }
 }
 public void removeTabAt(int position) {
   mTabLayout.removeViewAt(position);
   if (mTabSpinner != null) {
     ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged();
   }
   if (mAllowCollapse) {
     requestLayout();
   }
 }
  @Override
  public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY;
    setFillViewport(lockedExpanded);

    final int childCount = mTabLayout.getChildCount();
    if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) {
      if (childCount > 2) {
        mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
      } else {
        mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2;
      }
    } else {
      mMaxTabWidth = -1;
    }

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY);

    final boolean canCollapse = !lockedExpanded && mAllowCollapse;

    if (canCollapse) {
      // See if we should expand
      mTabLayout.measure(MeasureSpec.UNSPECIFIED, heightMeasureSpec);
      if (mTabLayout.getMeasuredWidth() > MeasureSpec.getSize(widthMeasureSpec)) {
        performCollapse();
      } else {
        performExpand();
      }
    } else {
      performExpand();
    }

    final int oldWidth = getMeasuredWidth();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    final int newWidth = getMeasuredWidth();

    if (lockedExpanded && oldWidth != newWidth) {
      // Recenter the tab display if we're at a new (scrollable) size.
      setTabSelected(mSelectedTabIndex);
    }
  }
  private void addTab(int index, CharSequence text, int iconResId) {
    final TabView tabView = new TabView(getContext());
    tabView.mIndex = index;
    tabView.setFocusable(true);
    tabView.setOnClickListener(mTabClickListener);
    tabView.setText(text);

    if (iconResId != 0) {
      tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
    }

    mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, MATCH_PARENT, 1));
  }
 public void addTab(ActionBar.Tab tab, boolean setSelected) {
   TabView tabView = createTabView(tab, false);
   mTabLayout.addView(tabView, new IcsLinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1));
   if (mTabSpinner != null) {
     ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged();
   }
   if (setSelected) {
     tabView.setSelected(true);
   }
   if (mAllowCollapse) {
     requestLayout();
   }
 }
 private void animateToTab(final int position) {
   final View tabView = mTabLayout.getChildAt(position);
   if (mTabSelector != null) {
     removeCallbacks(mTabSelector);
   }
   mTabSelector =
       new Runnable() {
         public void run() {
           final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2;
           smoothScrollTo(scrollPos, 0);
           mTabSelector = null;
         }
       };
   post(mTabSelector);
 }
 private void animateToIcon(final int position) {
   final View iconView = mIconsLayout.getChildAt(position);
   if (mIconSelector != null) {
     removeCallbacks(mIconSelector);
   }
   mIconSelector =
       new Runnable() {
         public void run() {
           final int scrollPos = iconView.getLeft() - (getWidth() - iconView.getWidth()) / 2;
           smoothScrollTo(scrollPos, 0);
           mIconSelector = null;
         }
       };
   post(mIconSelector);
 }
示例#14
0
  public void setNavigationMode(int mode) {
    final int oldMode = mNavigationMode;
    if (mode != oldMode) {
      switch (oldMode) {
        case ActionBar.NAVIGATION_MODE_LIST:
          if (mListNavLayout != null) {
            removeView(mListNavLayout);
          }
          break;
        case ActionBar.NAVIGATION_MODE_TABS:
          if (mTabScrollView != null && mIncludeTabs) {
            removeView(mTabScrollView);
          }
      }

      switch (mode) {
        case ActionBar.NAVIGATION_MODE_LIST:
          if (mSpinner == null) {
            mSpinner = new IcsSpinner(mContext, null, R.attr.actionDropDownStyleABS);
            mListNavLayout =
                (IcsLinearLayout)
                    LayoutInflater.from(mContext)
                        .inflate(R.layout.abs__action_bar_tab_bar_view, null);
            LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
            params.gravity = Gravity.CENTER;
            mListNavLayout.addView(mSpinner, params);
          }
          if (mSpinner.getAdapter() != mSpinnerAdapter) {
            mSpinner.setAdapter(mSpinnerAdapter);
          }
          mSpinner.setOnItemSelectedListener(mNavItemSelectedListener);
          addView(mListNavLayout);
          break;
        case ActionBar.NAVIGATION_MODE_TABS:
          if (mTabScrollView != null && mIncludeTabs) {
            addView(mTabScrollView);
          }
          break;
      }
      mNavigationMode = mode;
      requestLayout();
    }
  }
  @SuppressWarnings("MagicConstant")
  private IcsLinearLayout findOrInitializeChildLayout(
      final LinearLayout parentLayout, final int childIndex) {
    IcsLinearLayout childLayout = (IcsLinearLayout) parentLayout.getChildAt(childIndex);

    if (childLayout == null) {
      childLayout = linearLayoutPool.get();
      childLayout.setOrientation(LinearLayout.VERTICAL);

      if (listView.isDebugging()) childLayout.setBackgroundColor(Color.parseColor("#837BF2"));

      childLayout.setShowDividers(IcsLinearLayout.SHOW_DIVIDER_MIDDLE);
      childLayout.setDividerDrawable(
          context.getResources().getDrawable(R.drawable.item_divider_vertical));

      childLayout.setLayoutParams(
          new AbsListView.LayoutParams(
              AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.MATCH_PARENT));
      parentLayout.addView(childLayout);
    }

    return childLayout;
  }
示例#16
0
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    final int childCount = getChildCount();
    if (mIsCollapsable) {
      int visibleChildren = 0;
      for (int i = 0; i < childCount; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != GONE
            && !(child == mMenuView && mMenuView.getChildCount() == 0)) {
          visibleChildren++;
        }
      }

      if (visibleChildren == 0) {
        // No size for an empty action bar when collapsable.
        setMeasuredDimension(0, 0);
        mIsCollapsed = true;
        return;
      }
    }
    mIsCollapsed = false;

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    if (widthMode != MeasureSpec.EXACTLY) {
      throw new IllegalStateException(
          getClass().getSimpleName()
              + " can only be used "
              + "with android:layout_width=\"match_parent\" (or fill_parent)");
    }

    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    if (heightMode != MeasureSpec.AT_MOST) {
      throw new IllegalStateException(
          getClass().getSimpleName()
              + " can only be used "
              + "with android:layout_height=\"wrap_content\"");
    }

    int contentWidth = MeasureSpec.getSize(widthMeasureSpec);

    int maxHeight = mContentHeight > 0 ? mContentHeight : MeasureSpec.getSize(heightMeasureSpec);

    final int verticalPadding = getPaddingTop() + getPaddingBottom();
    final int paddingLeft = getPaddingLeft();
    final int paddingRight = getPaddingRight();
    final int height = maxHeight - verticalPadding;
    final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);

    int availableWidth = contentWidth - paddingLeft - paddingRight;
    int leftOfCenter = availableWidth / 2;
    int rightOfCenter = leftOfCenter;

    HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout;

    if (homeLayout.getVisibility() != GONE) {
      final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams();
      int homeWidthSpec;
      if (lp.width < 0) {
        homeWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST);
      } else {
        homeWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
      }
      homeLayout.measure(homeWidthSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
      final int homeWidth = homeLayout.getMeasuredWidth() + homeLayout.getLeftOffset();
      availableWidth = Math.max(0, availableWidth - homeWidth);
      leftOfCenter = Math.max(0, availableWidth - homeWidth);
    }

    if (mMenuView != null && mMenuView.getParent() == this) {
      availableWidth = measureChildView(mMenuView, availableWidth, childSpecHeight, 0);
      rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth());
    }

    if (mIndeterminateProgressView != null && mIndeterminateProgressView.getVisibility() != GONE) {
      availableWidth =
          measureChildView(mIndeterminateProgressView, availableWidth, childSpecHeight, 0);
      rightOfCenter = Math.max(0, rightOfCenter - mIndeterminateProgressView.getMeasuredWidth());
    }

    final boolean showTitle =
        mTitleLayout != null
            && mTitleLayout.getVisibility() != GONE
            && (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;

    if (mExpandedActionView == null) {
      switch (mNavigationMode) {
        case ActionBar.NAVIGATION_MODE_LIST:
          if (mListNavLayout != null) {
            final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding;
            availableWidth = Math.max(0, availableWidth - itemPaddingSize);
            leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize);
            mListNavLayout.measure(
                MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
            final int listNavWidth = mListNavLayout.getMeasuredWidth();
            availableWidth = Math.max(0, availableWidth - listNavWidth);
            leftOfCenter = Math.max(0, leftOfCenter - listNavWidth);
          }
          break;
        case ActionBar.NAVIGATION_MODE_TABS:
          if (mTabScrollView != null) {
            final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding;
            availableWidth = Math.max(0, availableWidth - itemPaddingSize);
            leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize);
            mTabScrollView.measure(
                MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
            final int tabWidth = mTabScrollView.getMeasuredWidth();
            availableWidth = Math.max(0, availableWidth - tabWidth);
            leftOfCenter = Math.max(0, leftOfCenter - tabWidth);
          }
          break;
      }
    }

    View customView = null;
    if (mExpandedActionView != null) {
      customView = mExpandedActionView;
    } else if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) {
      customView = mCustomNavView;
    }

    if (customView != null) {
      final ViewGroup.LayoutParams lp = generateLayoutParams(customView.getLayoutParams());
      final ActionBar.LayoutParams ablp =
          lp instanceof ActionBar.LayoutParams ? (ActionBar.LayoutParams) lp : null;

      int horizontalMargin = 0;
      int verticalMargin = 0;
      if (ablp != null) {
        horizontalMargin = ablp.leftMargin + ablp.rightMargin;
        verticalMargin = ablp.topMargin + ablp.bottomMargin;
      }

      // If the action bar is wrapping to its content height, don't allow a custom
      // view to MATCH_PARENT.
      int customNavHeightMode;
      if (mContentHeight <= 0) {
        customNavHeightMode = MeasureSpec.AT_MOST;
      } else {
        customNavHeightMode =
            lp.height != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST;
      }
      final int customNavHeight =
          Math.max(0, (lp.height >= 0 ? Math.min(lp.height, height) : height) - verticalMargin);

      final int customNavWidthMode =
          lp.width != LayoutParams.WRAP_CONTENT ? MeasureSpec.EXACTLY : MeasureSpec.AT_MOST;
      int customNavWidth =
          Math.max(
              0,
              (lp.width >= 0 ? Math.min(lp.width, availableWidth) : availableWidth)
                  - horizontalMargin);
      final int hgrav =
          (ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY) & Gravity.HORIZONTAL_GRAVITY_MASK;

      // Centering a custom view is treated specially; we try to center within the whole
      // action bar rather than in the available space.
      if (hgrav == Gravity.CENTER_HORIZONTAL && lp.width == LayoutParams.MATCH_PARENT) {
        customNavWidth = Math.min(leftOfCenter, rightOfCenter) * 2;
      }

      customView.measure(
          MeasureSpec.makeMeasureSpec(customNavWidth, customNavWidthMode),
          MeasureSpec.makeMeasureSpec(customNavHeight, customNavHeightMode));
      availableWidth -= horizontalMargin + customView.getMeasuredWidth();
    }

    if (mExpandedActionView == null && showTitle) {
      availableWidth =
          measureChildView(
              mTitleLayout,
              availableWidth,
              MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY),
              0);
      leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth());
    }

    if (mContentHeight <= 0) {
      int measuredHeight = 0;
      for (int i = 0; i < childCount; i++) {
        View v = getChildAt(i);
        int paddedViewHeight = v.getMeasuredHeight() + verticalPadding;
        if (paddedViewHeight > measuredHeight) {
          measuredHeight = paddedViewHeight;
        }
      }
      setMeasuredDimension(contentWidth, measuredHeight);
    } else {
      setMeasuredDimension(contentWidth, maxHeight);
    }

    if (mContextView != null) {
      mContextView.setContentHeight(getMeasuredHeight());
    }

    if (mProgressView != null && mProgressView.getVisibility() != GONE) {
      mProgressView.measure(
          MeasureSpec.makeMeasureSpec(contentWidth - mProgressBarPadding * 2, MeasureSpec.EXACTLY),
          MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST));
    }
  }
  @SuppressWarnings("MagicConstant")
  private IcsLinearLayout findOrInitializeLayout(final View convertView) {
    IcsLinearLayout layout;

    if (convertView == null || !(convertView instanceof IcsLinearLayout)) {
      layout = new IcsLinearLayout(context, null);
      if (listView.isDebugging()) layout.setBackgroundColor(Color.parseColor("#83F27B"));

      layout.setShowDividers(IcsLinearLayout.SHOW_DIVIDER_MIDDLE);
      layout.setDividerDrawable(
          context.getResources().getDrawable(R.drawable.item_divider_horizontal));

      layout.setLayoutParams(
          new AbsListView.LayoutParams(
              AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT));
    } else layout = (IcsLinearLayout) convertView;

    // Clear all layout children before starting
    for (int j = 0; j < layout.getChildCount(); j++) {
      IcsLinearLayout tempChild = (IcsLinearLayout) layout.getChildAt(j);
      linearLayoutPool.put(tempChild);
      for (int k = 0; k < tempChild.getChildCount(); k++) viewPool.put(tempChild.getChildAt(k));
      tempChild.removeAllViews();
    }
    layout.removeAllViews();

    return layout;
  }