From e7d468410b3a783560d5158a5798cef1b4b67702 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Thu, 13 Jan 2011 21:36:09 -0800 Subject: [PATCH] Rework action bar menus. Fix bug 3328810 - remove icons from action bar overflow menu. Popup menus now will not show icons. Give popup menu items a minimum width. Alter the sizing of popup menus. Fix bug 3192635 - revise rules for action menu dividers. Dividers now appear between the overflow button and any other items next to it, and anywhere they disambiguate touch targets between text and other content. Action views are on their own and should include their own dividers if needed. Remove dividers from around action bar spinners and tabs. Change-Id: I935b48b473606ac2adde5e2b251bf30ebe2a3da9 --- .../view/menu/ActionMenuItemView.java | 4 ++-- .../internal/view/menu/ActionMenuView.java | 22 ++++++++++++++----- .../internal/view/menu/ListMenuItemView.java | 11 ++++++---- .../internal/view/menu/MenuItemImpl.java | 1 - .../internal/widget/ActionBarView.java | 2 +- .../res/layout/action_menu_item_layout.xml | 7 +++--- core/res/res/layout/list_menu_item_icon.xml | 2 +- .../res/res/layout/popup_menu_item_layout.xml | 5 ++--- core/res/res/values/attrs.xml | 2 ++ core/res/res/values/styles.xml | 9 +++----- 10 files changed, 39 insertions(+), 26 deletions(-) diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java index d5f69bab9fcd3..7218ddc090f08 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java @@ -66,7 +66,7 @@ public class ActionMenuItemView extends LinearLayout mItemData = itemData; setIcon(itemData.getIcon()); - setTitle(itemData.getTitle()); // Title only takes effect if there is no icon + setTitle(itemData.getTitleForItemView(this)); // Title only takes effect if there is no icon setId(itemData.getItemId()); setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); @@ -91,7 +91,7 @@ public class ActionMenuItemView extends LinearLayout } public boolean prefersCondensedTitle() { - return false; + return true; } public void setCheckable(boolean checkable) { diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index 463902fe53e9b..8e491e9fdd620 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -20,9 +20,9 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -186,10 +186,14 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo boolean needsDivider = false; for (int i = 0; i < itemCount; i++) { + final MenuItemImpl itemData = itemsToShow.get(i); + boolean hasDivider = false; + if (needsDivider) { addView(makeDividerView(), makeDividerLayoutParams()); + hasDivider = true; } - final MenuItemImpl itemData = itemsToShow.get(i); + View actionView = itemData.getActionView(); if (actionView != null) { @@ -199,14 +203,22 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo } addView(actionView, makeActionViewLayoutParams(actionView)); } else { - needsDivider = addItemView(i == 0 || !needsDivider, - (ActionMenuItemView) itemData.getItemView( - MenuBuilder.TYPE_ACTION_BUTTON, this)); + ActionMenuItemView view = (ActionMenuItemView) itemData.getItemView( + MenuBuilder.TYPE_ACTION_BUTTON, this); + view.setItemInvoker(this); + if (i > 0 && !hasDivider && view.hasText() && itemData.getIcon() == null) { + addView(makeDividerView(), makeDividerLayoutParams()); + } + addView(view); + needsDivider = view.hasText(); } } if (reserveOverflow) { if (mMenu.getNonActionItems(true).size() > 0) { + if (itemCount > 0) { + addView(makeDividerView(), makeDividerLayoutParams()); + } OverflowMenuButton button = new OverflowMenuButton(mContext); addView(button); mOverflowButton = button; diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java index e15587520625b..02584b618cf24 100644 --- a/core/java/com/android/internal/view/menu/ListMenuItemView.java +++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java @@ -44,6 +44,7 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView private Drawable mBackground; private int mTextAppearance; private Context mTextAppearanceContext; + private boolean mPreserveIconSpacing; private int mMenuType; @@ -57,6 +58,8 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView mBackground = a.getDrawable(com.android.internal.R.styleable.MenuView_itemBackground); mTextAppearance = a.getResourceId(com.android.internal.R.styleable. MenuView_itemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + com.android.internal.R.styleable.MenuView_preserveIconSpacing, false); mTextAppearanceContext = context; a.recycle(); @@ -184,8 +187,8 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView } public void setIcon(Drawable icon) { - - if (!mItemData.shouldShowIcon(mMenuType)) { + final boolean showIcon = mItemData.shouldShowIcon(mMenuType); + if (!showIcon && !mPreserveIconSpacing) { return; } @@ -197,8 +200,8 @@ public class ListMenuItemView extends LinearLayout implements MenuView.ItemView insertIconView(); } - if (icon != null) { - mIconView.setImageDrawable(icon); + if (icon != null || mPreserveIconSpacing) { + mIconView.setImageDrawable(showIcon ? icon : null); if (mIconView.getVisibility() != VISIBLE) { mIconView.setVisibility(VISIBLE); diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index e1aa385fa051a..6fbae9446f30a 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -644,7 +644,6 @@ public final class MenuItemImpl implements MenuItem { public boolean shouldShowIcon(int menuType) { return menuType == MenuBuilder.TYPE_ICON || menuType == MenuBuilder.TYPE_ACTION_BUTTON || - menuType == MenuBuilder.TYPE_POPUP || mMenu.getOptionalIconsVisible(); } diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index 1d9276a39daf8..297dde78254b3 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -437,7 +437,7 @@ public class ActionBarView extends ViewGroup { mListNavLayout = new LinearLayout(mContext, null, com.android.internal.R.attr.actionBarTabBarStyle); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); params.gravity = Gravity.CENTER; mListNavLayout.addView(mSpinner, params); } diff --git a/core/res/res/layout/action_menu_item_layout.xml b/core/res/res/layout/action_menu_item_layout.xml index e502b1e6c03a2..e0018945d7b4f 100644 --- a/core/res/res/layout/action_menu_item_layout.xml +++ b/core/res/res/layout/action_menu_item_layout.xml @@ -20,10 +20,11 @@ android:layout_gravity="center" android:addStatesFromChildren="true" android:background="?attr/selectableItemBackground" - android:minWidth="64dip" - android:minHeight="?attr/actionBarSize" + android:gravity="center" android:paddingLeft="12dip" - android:paddingRight="12dip"> + android:paddingRight="12dip" + android:minWidth="64dip" + android:minHeight="?attr/actionBarSize"> diff --git a/core/res/res/layout/popup_menu_item_layout.xml b/core/res/res/layout/popup_menu_item_layout.xml index 2bbb4d06baf17..d22f74a055b7d 100644 --- a/core/res/res/layout/popup_menu_item_layout.xml +++ b/core/res/res/layout/popup_menu_item_layout.xml @@ -16,7 +16,8 @@ @@ -28,8 +29,6 @@ android:layout_weight="1" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginLeft="6dip" - android:layout_marginRight="6dip" android:duplicateParentState="true"> + + diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index cf9c00b2547d9..1183915003d3e 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1194,7 +1194,7 @@