FileDocCategorySizeDatePackage
ActionBarContainer.javaAPI DocAndroid 5.1 API12424Thu Mar 12 22:22:56 GMT 2015android.support.v7.internal.widget

ActionBarContainer

public class ActionBarContainer extends android.widget.FrameLayout
This class acts as a container for the action bar view and action mode context views. It applies special styles as needed to help handle animated transitions between them.
hide

Fields Summary
private boolean
mIsTransitioning
private android.view.View
mTabContainer
private android.view.View
mActionBarView
private android.view.View
mContextView
android.graphics.drawable.Drawable
mBackground
android.graphics.drawable.Drawable
mStackedBackground
android.graphics.drawable.Drawable
mSplitBackground
boolean
mIsSplit
boolean
mIsStacked
private int
mHeight
Constructors Summary
public ActionBarContainer(android.content.Context context)

        this(context, null);
    
public ActionBarContainer(android.content.Context context, android.util.AttributeSet attrs)

        super(context, attrs);

        // Set a transparent background so that we project appropriately.
        final Drawable bg = VersionUtils.isAtLeastL()
                ? new ActionBarBackgroundDrawableV21(this)
                : new ActionBarBackgroundDrawable(this);
        setBackgroundDrawable(bg);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.ActionBar);
        mBackground = a.getDrawable(R.styleable.ActionBar_background);
        mStackedBackground = a.getDrawable(
                R.styleable.ActionBar_backgroundStacked);
        mHeight = a.getDimensionPixelSize(R.styleable.ActionBar_height, -1);

        if (getId() == R.id.split_action_bar) {
            mIsSplit = true;
            mSplitBackground = a.getDrawable(R.styleable.ActionBar_backgroundSplit);
        }
        a.recycle();

        setWillNotDraw(mIsSplit ? mSplitBackground == null :
                mBackground == null && mStackedBackground == null);
    
Methods Summary
protected voiddrawableStateChanged()

        super.drawableStateChanged();
        if (mBackground != null && mBackground.isStateful()) {
            mBackground.setState(getDrawableState());
        }
        if (mStackedBackground != null && mStackedBackground.isStateful()) {
            mStackedBackground.setState(getDrawableState());
        }
        if (mSplitBackground != null && mSplitBackground.isStateful()) {
            mSplitBackground.setState(getDrawableState());
        }
    
private intgetMeasuredHeightWithMargins(android.view.View view)

        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
        return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
    
public android.view.ViewgetTabContainer()

        return mTabContainer;
    
private booleanisCollapsed(android.view.View view)

        return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0;
    
public voidjumpDrawablesToCurrentState()

        if (Build.VERSION.SDK_INT >= 11) {
            super.jumpDrawablesToCurrentState();
            if (mBackground != null) {
                mBackground.jumpToCurrentState();
            }
            if (mStackedBackground != null) {
                mStackedBackground.jumpToCurrentState();
            }
            if (mSplitBackground != null) {
                mSplitBackground.jumpToCurrentState();
            }
        }
    
public voidonFinishInflate()

        super.onFinishInflate();
        mActionBarView = findViewById(R.id.action_bar);
        mContextView = findViewById(R.id.action_context_bar);
    
public booleanonInterceptTouchEvent(android.view.MotionEvent ev)

        return mIsTransitioning || super.onInterceptTouchEvent(ev);
    
public voidonLayout(boolean changed, int l, int t, int r, int b)

        super.onLayout(changed, l, t, r, b);

        final View tabContainer = mTabContainer;
        final boolean hasTabs = tabContainer != null && tabContainer.getVisibility() != GONE;

        if (tabContainer != null && tabContainer.getVisibility() != GONE) {
            final int containerHeight = getMeasuredHeight();
            final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams();
            final int tabHeight = tabContainer.getMeasuredHeight();
            tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r,
                    containerHeight - lp.bottomMargin);
        }

        boolean needsInvalidate = false;
        if (mIsSplit) {
            if (mSplitBackground != null) {
                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                needsInvalidate = true;
            }
        } else {
            if (mBackground != null) {
                if (mActionBarView.getVisibility() == View.VISIBLE) {
                    mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
                            mActionBarView.getRight(), mActionBarView.getBottom());
                } else if (mContextView != null &&
                        mContextView.getVisibility() == View.VISIBLE) {
                    mBackground.setBounds(mContextView.getLeft(), mContextView.getTop(),
                            mContextView.getRight(), mContextView.getBottom());
                } else {
                    mBackground.setBounds(0, 0, 0, 0);
                }
                needsInvalidate = true;
            }
            mIsStacked = hasTabs;
            if (hasTabs && mStackedBackground != null) {
                mStackedBackground.setBounds(tabContainer.getLeft(), tabContainer.getTop(),
                        tabContainer.getRight(), tabContainer.getBottom());
                needsInvalidate = true;
            }
        }

        if (needsInvalidate) {
            invalidate();
        }
    
public voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)

        if (mActionBarView == null &&
                MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && mHeight >= 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
                    Math.min(mHeight, MeasureSpec.getSize(heightMeasureSpec)), MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        if (mActionBarView == null) return;

        final int mode = MeasureSpec.getMode(heightMeasureSpec);
        if (mTabContainer != null && mTabContainer.getVisibility() != GONE
                && mode != MeasureSpec.EXACTLY) {
            final int topMarginForTabs;
            if (!isCollapsed(mActionBarView)) {
                topMarginForTabs = getMeasuredHeightWithMargins(mActionBarView);
            } else if (!isCollapsed(mContextView)) {
                topMarginForTabs = getMeasuredHeightWithMargins(mContextView);
            } else {
                topMarginForTabs = 0;
            }
            final int maxHeight = mode == MeasureSpec.AT_MOST ?
                    MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE;
            setMeasuredDimension(getMeasuredWidth(),
                    Math.min(topMarginForTabs + getMeasuredHeightWithMargins(mTabContainer),
                            maxHeight));
        }
    
public booleanonTouchEvent(android.view.MotionEvent ev)

        super.onTouchEvent(ev);

        // An action bar always eats touch events.
        return true;
    
public voidsetPrimaryBackground(android.graphics.drawable.Drawable bg)

        if (mBackground != null) {
            mBackground.setCallback(null);
            unscheduleDrawable(mBackground);
        }
        mBackground = bg;
        if (bg != null) {
            bg.setCallback(this);
            if (mActionBarView != null) {
                mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(),
                        mActionBarView.getRight(), mActionBarView.getBottom());
            }
        }
        setWillNotDraw(mIsSplit ? mSplitBackground == null :
                mBackground == null && mStackedBackground == null);
        invalidate();
    
public voidsetSplitBackground(android.graphics.drawable.Drawable bg)

        if (mSplitBackground != null) {
            mSplitBackground.setCallback(null);
            unscheduleDrawable(mSplitBackground);
        }
        mSplitBackground = bg;
        if (bg != null) {
            bg.setCallback(this);
            if (mIsSplit && mSplitBackground != null) {
                mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
            }
        }
        setWillNotDraw(mIsSplit ? mSplitBackground == null :
                mBackground == null && mStackedBackground == null);
        invalidate();
    
public voidsetStackedBackground(android.graphics.drawable.Drawable bg)

        if (mStackedBackground != null) {
            mStackedBackground.setCallback(null);
            unscheduleDrawable(mStackedBackground);
        }
        mStackedBackground = bg;
        if (bg != null) {
            bg.setCallback(this);
            if ((mIsStacked && mStackedBackground != null)) {
                mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(),
                        mTabContainer.getRight(), mTabContainer.getBottom());
            }
        }
        setWillNotDraw(mIsSplit ? mSplitBackground == null :
                mBackground == null && mStackedBackground == null);
        invalidate();
    
public voidsetTabContainer(ScrollingTabContainerView tabView)

        if (mTabContainer != null) {
            removeView(mTabContainer);
        }
        mTabContainer = tabView;
        if (tabView != null) {
            addView(tabView);
            final ViewGroup.LayoutParams lp = tabView.getLayoutParams();
            lp.width = LayoutParams.MATCH_PARENT;
            lp.height = LayoutParams.WRAP_CONTENT;
            tabView.setAllowCollapse(false);
        }
    
public voidsetTransitioning(boolean isTransitioning)
Set the action bar into a "transitioning" state. While transitioning the bar will block focus and touch from all of its descendants. This prevents the user from interacting with the bar while it is animating in or out.

param
isTransitioning true if the bar is currently transitioning, false otherwise.

        mIsTransitioning = isTransitioning;
        setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS
                : FOCUS_AFTER_DESCENDANTS);
    
public voidsetVisibility(int visibility)

        super.setVisibility(visibility);
        final boolean isVisible = visibility == VISIBLE;
        if (mBackground != null) mBackground.setVisible(isVisible, false);
        if (mStackedBackground != null) mStackedBackground.setVisible(isVisible, false);
        if (mSplitBackground != null) mSplitBackground.setVisible(isVisible, false);
    
public android.support.v7.view.ActionModestartActionModeForChild(android.view.View child, ActionMode.Callback callback)

        // No starting an action mode for an action bar child! (Where would it go?)
        return null;
    
public android.view.ActionModestartActionModeForChild(android.view.View originalView, android.view.ActionMode.Callback callback)

        return null;
    
protected booleanverifyDrawable(android.graphics.drawable.Drawable who)

        return (who == mBackground && !mIsSplit) || (who == mStackedBackground && mIsStacked) ||
                (who == mSplitBackground && mIsSplit) || super.verifyDrawable(who);