Action bar tab layout tweaks.
Let tabs consume the full action bar when the menu is empty and other
elements are disabled when the tab bar would normally split onto a
second row..
Fix bug 4489724 - bug in ActionBarImpl#cleanupTabs.
Change-Id: I28a235d339137add0b106c6e733a6767fa547810
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 183cfbd..6cfeb87 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -176,6 +176,8 @@
}
mActionView.setEmbeddedTabView(mTabScrollView);
}
+ mActionView.setCollapsable(!mHasEmbeddedTabs &&
+ getNavigationMode() == NAVIGATION_MODE_TABS);
TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar);
mContentHeight = a.getLayoutDimension(R.styleable.ActionBar_height, 0);
@@ -307,7 +309,9 @@
selectTab(null);
}
mTabs.clear();
- mTabScrollView.removeAllTabs();
+ if (mTabScrollView != null) {
+ mTabScrollView.removeAllTabs();
+ }
mSavedTabPosition = INVALID_POSITION;
}
@@ -887,6 +891,7 @@
}
break;
}
+ mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs);
}
@Override
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index f1618e1..1726390 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -96,13 +96,26 @@
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ int nonTabHeight = 0;
+ final int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ final View child = getChildAt(i);
+ if (child == mTabContainer) {
+ continue;
+ }
+
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ nonTabHeight = Math.max(nonTabHeight,
+ child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
+ }
+
if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
final int mode = MeasureSpec.getMode(heightMeasureSpec);
if (mode == MeasureSpec.AT_MOST) {
- final int measuredHeight = getMeasuredHeight();
final int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(getMeasuredWidth(),
- Math.min(measuredHeight + mTabContainer.getMeasuredHeight(), maxHeight));
+ Math.min(nonTabHeight + mTabContainer.getMeasuredHeight(), maxHeight));
}
}
}
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index ff04735..ef8481f 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -111,6 +111,7 @@
private boolean mSplitActionBar;
private boolean mUserTitle;
private boolean mIncludeTabs;
+ private boolean mIsCollapsable;
private MenuBuilder mOptionsMenu;
@@ -629,8 +630,30 @@
mContextView = view;
}
+ public void setCollapsable(boolean collapsable) {
+ mIsCollapsable = collapsable;
+ }
+
@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);
+ return;
+ }
+ }
+
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
if (widthMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException(getClass().getSimpleName() + " can only be used " +
@@ -761,8 +784,7 @@
if (mContentHeight <= 0) {
int measuredHeight = 0;
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < childCount; i++) {
View v = getChildAt(i);
int paddedViewHeight = v.getMeasuredHeight() + verticalPadding;
if (paddedViewHeight > measuredHeight) {
@@ -791,6 +813,11 @@
final int y = getPaddingTop();
final int contentHeight = b - t - getPaddingTop() - getPaddingBottom();
+ if (contentHeight <= 0) {
+ // Nothing to do if we can't see anything.
+ return;
+ }
+
if (mHomeLayout.getVisibility() != GONE) {
x += positionChild(mHomeLayout, x, y, contentHeight);
}